【问题标题】:Strange behavior with std::map::iterator's postincrementstd::map::iterators 后增量的奇怪行为
【发布时间】:2013-05-19 02:02:01
【问题描述】:

据我了解,以下程序

#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 无限循环。该程序表现出的行为是否正确,或者标准库中是否存在错误? operator++(int) 在迭代器上的操作属性是什么?

【问题讨论】:

    标签: c++ map stl iterator


    【解决方案1】:

    map 是空的,所以第一个 start++ 试图增加一个 end 迭代器,这是未定义的行为。来自std::map::end()

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

    即使后增量 start++ 返回 start 的原始值,在本例中为 end(),但由于存在未定义的行为,期望循环终止是不合理的。

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

    【讨论】:

    • 啊哈!这就说得通了。谢谢。
    • 对您的回答的奖励问题:所以迭代器的行为与原语不同? for int -> i++ 返回 i 的旧值,而 ++i 返回新值。所以 start++ 应该返回 foo.end() 因为那是迭代前的值。
    • @ChriZzZ,但start 仍被修改,这是未定义的行为。因此,在存在未定义行为的情况下,期望循环终止是不合理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2011-03-06
    相关资源
    最近更新 更多