2

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

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

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

我真的很感激澄清。

4

4 回答 4

7

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

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

通常,当您希望覆盖整个范围时,最好在所有迭代器上使用“不等于”,即使这些迭代器允许比较<>。还有一个支持!=在常规for循环中使用的论点,因为它为您提供了最强的后置条件

于 2013-02-21T15:48:16.257 回答
1

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

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

于 2013-02-21T15:49:15.693 回答
0

那是因为list不支持随机访问迭代器,而只支持前向迭代器。因此,operator <没有为 a 的迭代器定义list。您必须operator !=用于不等式比较。

于 2013-02-21T15:49:31.033 回答
0

运算符算术,包括排序比较运算符(如<),仅为随机访问迭代器定义。如果您将代码更改为 use !=,它将起作用(假设obj是 a list<int>):

for(list<int>::iterator it = obj.begin(); it != obj.end(); it++){
    // some code
}
于 2013-02-21T15:49:56.963 回答