C++:列表迭代器与向量迭代器
C++: list iterators vs. vector iterators
我认为迭代器对象的想法是,您可以将其类似地应用于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 !=
进行不等式比较。
运算符算术,包括排序比较运算符(如<
),仅为随机访问迭代器定义。如果您将代码更改为使用!=
,它将起作用(假设obj
是list<int>
):
for(list<int>::iterator it = obj.begin(); it != obj.end(); it++){
// some code
}
相关文章:
- 使用迭代器时如何访问对象在向量中的位置?
- 在 C++ 向量构造中包含迭代器
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- C++迭代器和向量
- 在无法访问向量的情况下查找迭代器的末尾
- C++ 向量插入和迭代器混淆
- 如何在C++中仅使用迭代器正确迭代 3D 向量?
- C++结构编译器错误询问向量的迭代器
- 为什么迭代器没有到达向量末端?
- 如何使用迭代器填充未知大小的向量?
- C++如何为向量向量构建迭代器
- 如何使用迭代器指向结构体c++的向量
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- 在C++中使用带有自定义向量的迭代器
- 使用条件迭代器插入到向量中
- 如何取消引用向量迭代器
- 如何从给定另一个迭代器向量的向量中删除元素
- 为什么迭代器向量::插入在填充后无效:迭代器插入(const_iterator位置,size_type n,常量value_type和val);
- C++ - 迭代器向量未编译的迭代器
- 对迭代器向量的重载<<