2013-02-21 140 views
2

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

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

而且出现错误。为什么这不起作用?为什么它会为vector::iterator工作?仅仅是因为列表的实现是双向链表?我认为迭代器对象抽象出在容器中移动的概念,从而使它在操作上可以相同,无论是向量还是列表。

我真的很感谢澄清。

+1

neagoegab 2013-02-21 15:48:34

+0

什么错误?编译器会告诉你什么? – sth 2013-02-21 15:50:24

回答

7

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

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

在一般情况下,这是一个好主意,当你正在寻找覆盖整个范围,即使这些迭代器允许使用“不等于”所有的迭代器<比较和>。也有人赞成在你的常规for循环中使用!=,因为它给了你最强的postcondition

1

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

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

0

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

0

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

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