【问题标题】:How to get a certain element in a list, given the position?给定位置,如何获取列表中的某个元素?
【发布时间】:2011-08-09 16:23:22
【问题描述】:

所以我有一个清单:

list<Object> myList;
myList.push_back(Object myObject);

我不确定,但我相信这将是数组中的“第 0 个”元素。 我可以使用任何函数来返回“myObject”吗?

Object copy = myList.find_element(0);

?

【问题讨论】:

  • 没有数组——它是一个列表。如果要按整数索引,为什么不改用vector
  • 如果你总是想要元素 0,请使用front()
  • 我没有对此进行测试,但我认为 myList.front() + num 可以在这里工作
  • @SergueiFedorov:不,它没有

标签: c++ list stl


【解决方案1】:

效率不是很高,但如果必须使用列表,可以遵循迭代器

*myList.begin()+N

【讨论】:

    【解决方案2】:

    也许不是最有效的方法。但是您可以将列表转换为向量。

    #include <list>
    #include <vector>
    
    list<Object> myList;
    
    vector<Object> myVector(myList.begin(), myList.end());
    

    然后使用 [x] 运算符访问向量。

    auto x = MyVector[0];
    

    你可以把它放在一个辅助函数中:

    #include <memory>
    #include <vector>
    #include <list>
    
    template<class T>
    shared_ptr<vector<T>> 
    ListToVector(list<T> List) {
    shared_ptr<vector<T>> Vector {
            new vector<string>(List.begin(), List.end()) }
    return Vector;
    }
    

    然后像这样使用辅助函数:

    auto MyVector = ListToVector(Object);
    auto x = MyVector[0];
    

    【讨论】:

      【解决方案3】:

      std::list 不提供任何函数来获取给定索引的元素。您可以尝试通过编写一些代码来获得它,我不建议这样做,因为如果您经常需要这样做,那将是低效的。

      您需要的是:std::vector。将其用作:

      std::vector<Object> objects;
      objects.push_back(myObject);
      
      Object const & x = objects[0];    //index isn't checked
      Object const & y = objects.at(0); //index is checked 
      

      【讨论】:

        【解决方案4】:
        std::list<Object> l; 
        std::list<Object>::iterator ptr;
        int i;
        
        for( i = 0 , ptr = l.begin() ; i < N && ptr != l.end() ; i++ , ptr++ );
        
        if( ptr == l.end() ) {
            // list too short  
        } else {
            // 'ptr' points to N-th element of list
        }
        

        【讨论】:

          【解决方案5】:

          如果您经常需要访问序列的第 N 个元素,那么实现为双向链表的std::list 可能不是正确的选择。 std::vectorstd::deque 可能会更好。

          也就是说,您可以使用 std::advance 获取第 N 个元素的迭代器:

          std::list<Object> l;
          // add elements to list 'l'...
          
          unsigned N = /* index of the element you want to retrieve */;
          if (l.size() > N)
          {
              std::list<Object>::iterator it = l.begin();
              std::advance(it, N);
              // 'it' points to the element at index 'N'
          }
          

          对于不提供随机访问的容器,例如std::liststd::advance 在迭代器N 上调用operator++ 次。或者,如果您的标准库实现提供了它,您可以调用std::next

          if (l.size() > N)
          {
              std::list<Object>::iterator it = std::next(l.begin(), N);
          }
          

          std::next 有效地包装了对std::advance 的调用,从而使迭代器N 的前进时间变得更容易,代码行数和可变变量更少。 std::next 是在 C++11 中添加的。

          【讨论】:

          • 虽然由于缺乏随机访问而在搜索链表时会付出性能损失,但如果您需要在向量或双端队列中间插入或删除数据,则会付出更大的性能损失。该问题实际上并没有包含足够的信息来决定他们是否将理想的容器用于他们的目的。
          • 值得注意的是,在使用std::advancestd::next时,很容易调用UB。没有边界检查。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-22
          • 2014-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多