如果地图中只有单个元素,那么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
答案 0 :(得分:6)
在begin()之前向元素递减某些内容没有意义。这是未定义的行为,没有正确或错误的答案。
答案 1 :(得分:2)
对于迭代器r
,如果在操作完成之前,--r
存在s
,那么r == ++s
和操作完成后r
s
有效r
是可解除引用的。 (§24.2.6Bidirectional.iterators)
由于begin()将迭代器返回到容器的第一个元素,因此没有元素{{1}}可以递增到{{1}},所以这是未定义的。