所以我有一个清单:
list<Object> myList;
myList.push_back(Object myObject);
我不确定,但我确信这将是数组中的“第0个”元素。 我可以使用任何会返回“myObject”的函数吗?
Object copy = myList.find_element(0);
答案 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