2

如果地图中只有单个元素,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,在带有 g++ 4.6 的 Linux 上它将打印 isend: 0。

问题:上面的减量真的是UB的情况吗?如果不是,那么什么结果是正确的 - Windows 或 Linux 一个?

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

4

2 回答 2

7

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

于 2013-05-02T09:53:34.687 回答
2

对于迭代器,如果在操作完成之前存在这样的操作并且在操作完成之后是可取消引用的,则r该操作是有效的。(§24.2.6 双向迭代器)--rsr == ++sr

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

于 2013-05-02T10:09:53.273 回答