std :: map :: iterator减少单个元素

时间:2013-05-02 09:47:58

标签: c++ visual-c++ gcc stl stdmap

如果地图中只有单个元素,那么std :: map迭代器应该返回什么?这是示例代码

#include <map>
#include <stdio.h>
int main()
{
    std::map<int, int> m;
    m.insert(std::make_pair(1, 1));
    //std::map<int, int>::iterator it = m.begin();
    std::map<int, int>::iterator it = m.upper_bound(0);
    printf("isbegin: %d\n", it == m.begin());
    --it;
    bool isend = it == m.end();
    printf("isend: %d\n", isend);
}

在Windows上,它将打印isend:1,在Linux上使用g ++ 4.6,它将打印isend:0。

问题:上面的减量真的是UB的情况吗?如果没有,那么结果是正确的 - Windows还是Linux?

更新:修改代码以显示调用upper_bound

2 个答案:

答案 0 :(得分:6)

在begin()之前向元素递减某些内容没有意义。这是未定义的行为,没有正确或错误的答案。

答案 1 :(得分:2)

对于迭代器r,如果在操作完成之前,--r存在s,那么r == ++s和操作完成后r s有效r是可解除引用的。 (§24.2.6Bidirectional.iterators)

由于begin()将迭代器返回到容器的第一个元素,因此没有元素{{1}}可以递增到{{1}},所以这是未定义的。