在给定位置的情况下如何获得列表中的某个元素?

时间:2011-04-20 16:51:17

标签: c++ list stl

所以我有一个清单:

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

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

Object copy = myList.find_element(0);

5 个答案:

答案 0 :(得分:118)

如果您经常需要访问序列的第N个元素,std::list(实现为双向链表)可能不是正确的选择。 <{1}}或std::vector可能会更好。

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

std::advance

对于不提供随机访问的容器,例如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::list在迭代器std::advance上调用operator++次。或者,如果您的标准库实现提供了它,您可以致电N

std::next

if (l.size() > N) { std::list<Object>::iterator it = std::next(l.begin(), N); } 实际上包含了对std::next的调用,使用更少的代码行和更少的可变变量更容易推进迭代器std::advance次。在C ++ 11中添加了N

答案 1 :(得分:30)

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 

答案 2 :(得分:6)

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
}

答案 3 :(得分: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];

答案 4 :(得分:1)

效率不高,但是如果一定要使用列表,可以参考迭代器

*myList.begin()+N