C ++:列出迭代器与矢量迭代器

时间:2013-02-21 15:46:42

标签: c++ stl iterator containers

我认为迭代器对象的想法是你可以类似地将它应用于C ++容器类。但是,当我尝试遍历列表对象时,我尝试使用

for(list<int>::iterator it = obj.begin(); it < obj.end(); it++){
    // some code
}

我收到了一个错误。为什么这不起作用?为什么它适用于vector::iterator?是仅仅因为列表的实现是双向链表?我认为迭代器对象抽象了通过容器移动的概念,从而允许它在操作上是相同的,无论是向量还是列表。

我真的很感激澄清。

4 个答案:

答案 0 :(得分:7)

这不起作用,因为与std::vector迭代器不同,std::list迭代器不是随机访问 - 它们是顺序的。您需要对它们使用!=

for(list<int>::iterator it = obj.begin(); it != obj.end(); it++)

通常,当您希望覆盖整个范围时,在所有迭代器上使用“not equals”是个好主意,即使这些迭代器允许对<>进行比较。还有一个论点支持在常规!=循环中使用for,因为它会为您提供最强postcondition

答案 1 :(得分:1)

您必须与!=进行比较,因为列表迭代器按随机顺序分散在所有内存中。

使用:for(list<int>::iterator it = obj.begin(); it != obj.end(); it++)

答案 2 :(得分:0)

那是因为list不支持随机访问迭代器,而只支持 forward 迭代器。因此,operator <的迭代器未定义list。您必须使用operator !=进行不等式比较。

答案 3 :(得分:0)

运算符算术(包括排序比较运算符(如<))仅为随机访问迭代器定义。如果您将代码更改为使用!=,则会有效(假设objlist<int>):

for(list<int>::iterator it = obj.begin(); it != obj.end(); it++){
    // some code
}