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

Tes*_*est 86 c++ stl list

所以我有一个清单:

list<Object> myList;
myList.push_back(Object myObject);
Run Code Online (Sandbox Code Playgroud)

我不确定,但我相信这将是数组中的"第0个"元素.是否有任何我可以使用的函数将返回"myObject"?

Object copy = myList.find_element(0);
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 121

如果您经常需要访问序列的第N个元素std::list(实现为双向链表),则可能不是正确的选择. 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'
}
Run Code Online (Sandbox Code Playgroud)

对于一个容器,不提供随机访问,如std::list,std::advance要求operator++于迭代N倍.或者,如果您的标准库实现提供了它,您可以致电std::next:

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

std::next实际上是包装调用std::advance,N使用更少的代码行和更少的可变变量更容易推进迭代器时间. std::next在C++ 11中添加了.

  • 由于缺少随机访问而在搜索链表时支付性能损失,如果需要在向量或双端队列中插入或删除数据,则会产生更大的性能损失.该问题实际上并未包含足够的信息来决定他们是否将理想容器用于其目的. (15认同)
  • 值得注意的是,当使用`std::advance`或`std::next`时,很容易调用UB。没有边界检查。 (2认同)

Naw*_*waz 31

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 
Run Code Online (Sandbox Code Playgroud)


fur*_*ras 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
}
Run Code Online (Sandbox Code Playgroud)