【问题标题】:C++: list iterators vs. vector iteratorsC++:列表迭代器与向量迭代器
【发布时间】:2013-02-07 00:31:03
【问题描述】:

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

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

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

非常感谢您的澄清。

【问题讨论】:

  • it here) 并使用非成员开始和结束如果你使用 c++11 ......也许你不希望每次都调用 end 函数......
  • 什么错误?编译器会告诉你什么吗?

标签: c++ stl iterator containers


【解决方案1】:

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

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

一般来说,当您希望覆盖整个范围时,最好在所有迭代器上使用“不等于”,即使这些迭代器允许比较 &lt;&gt;。还有一个观点支持在您的常规for 循环中使用!=,因为它为您提供了最强的postcondition

【讨论】:

    【解决方案2】:

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

    使用:for(list&lt;int&gt;::iterator it = obj.begin(); it != obj.end(); it++)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2010-10-27
          • 2013-12-16
          • 1970-01-01
          • 2014-10-13
          • 1970-01-01
          • 1970-01-01
          • 2018-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多