C++:列表迭代器与向量迭代器

C++: list iterators vs. vector iterators

本文关键字:迭代器 向量 列表 C++      更新时间:2023-10-16

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

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

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

如果能澄清,我将不胜感激。

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

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

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

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

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

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

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

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