比较两个end()迭代器

时间:2010-03-31 01:57:25

标签: c++ stl iterator

list<int> foo;
list<int> foo2;
list<int>::iterator foo_end = foo.end();
list<int>::iterator foo2_end = foo2.end();

for (list<int>::iterator it = foo.begin(); it != foo2_end; ++foo) <- notice != comparison here
{
   ...
这是允许的吗?它会正常工作吗?

我倾向于认为这是依赖于实现的,任何人都知道标准是否说明了这一点?

3 个答案:

答案 0 :(得分:7)

有关于此的报道(LWG defect 446)存在缺陷。缺陷报告询问是否有效比较引用不同容器元素的迭代器。

缺陷报告中的注释解释说,这样做的意图当然是未定义的,但没有明确说明它是未定义的。

建议的解决方案是在标准中添加以下内容,明确指出它未定义:

  

直接或间接评估任何比较函数或二元 - 运算符的结果,其中两个迭代器值作为参数从两个不同的范围r1和r2(包括它们的过去值)获得,这两个范围不是一个子范围除非另有明确说明,否则公共范围是未定义的。

编辑:该语言未包含在C ++ 0x FCD中。事实上,N3066的变化解决了这个问题;特别是以下补充(§24.2.5/ 2):

  

前向迭代器的==域是相同底层序列上的迭代器的域。

答案 1 :(得分:2)

允许(即将编译) 它无法正常工作。

foo2_end指向foo2的末尾,而不是foo,因此您的迭代器将从foo的开头开始,到达foo2的末尾时结束1}},这将永远不会,因为你正在迭代foo。一旦it迭代超过foo的末尾,您将遇到段错误。

注意:我认为您打算写++it,而不是++foo

答案 2 :(得分:1)

它会编译但会导致seg错误。迭代器是特定于对象的,比较来自不同对象的两个迭代器总是会产生不等式。因此,it != foo2_end表达式将始终评估为true,并且当it到达foo.end()并且您尝试取消引用它时,程序将崩溃。