给定位置,如何获取列表中的某个元素?


92

所以我有一个清单:

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

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

Object copy = myList.find_element(0);


8
没有数组-这是一个列表。如果要按整数索引,为什么不使用它vector呢?
Paul J. Lucas

2
如果您始终需要元素0,请使用front()
Paul J. Lucas

我尚未对此进行测试,但是我认为myList.front()+ num在这里可以工作
Serguei Fedorov

2
@SergueiFedorov:不,不是
Algoman

Answers:


129

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

也就是说,您可以使用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::liststd::advance调用operator++迭代器N时间。另外,如果您的标准库实现提供了此代码,则可以调用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中添加的。


18
尽管由于缺少随机访问而对搜索链接列表造成性能损失,但是如果您需要在向量或双端队列的中间插入或删除数据,则会付出更大的性能损失。该问题实际上没有包含足够的信息来确定他们是否出于其目的使用理想的容器。
tloach

1
值得注意的是,使用std::advance或时std::next,很容易调用UB。没有边界检查。
okovko

33

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 

7
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

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

#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];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.