Std::map::iterator对单个元素进行自减

std::map::iterator decrement on single element

本文关键字:元素 单个 map iterator Std      更新时间:2023-10-16

如果映射中只有一个元素,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: %dn", it == m.begin());
    --it;
    bool isend = it == m.end();
    printf("isend: %dn", isend);
}

在Windows上它将打印isend: 1,在Linux上它将打印isend: 0。

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

更新:修改代码,显示upper_bound被称为

在begin()之前对元素进行自减是没有意义的。这是未定义的行为,没有正确或错误的答案。

对于迭代器r,如果在操作完成之前存在s,使得r == ++s和操作完成后r可解引用,则操作--r有效。(§24.2.6双向的。迭代器)

因为begin()返回的是指向容器第一个元素的迭代器,所以没有元素s可以被加到r,所以这是未定义的