使用std :: map :: iterators增加的奇怪行为

时间:2013-05-23 15:54:03

标签: c++ map stl iterator

据我了解,以下程序

#include <map>

int main()
{
    std::map<int,int> foo;
    std::map<int,int>::iterator start = foo.begin();
    while (start++ != foo.end())
        ;
}

应该终止,但它使用libstdc ++ 4.7.2无限循环。此程序显示的行为是否正确,或者标准库中是否存在错误?在迭代器上运算符++(int)的操作属性是什么?

1 个答案:

答案 0 :(得分:7)

map为空,因此第一个start++正在尝试递增end迭代器,这是未定义的行为。来自std::map::end()

  

返回容器最后一个元素后面元素的迭代器。   该元素充当占位符;试图访问它会导致未定义的行为。

即使后增量start++返回start的原始值(在这种情况下为end()),由于存在而导致循环终止是不合理的未定义的行为。

要更正,请在递增或取消引用前检查start是否等于foo.end()

相关问题