【问题标题】:std::map::iterator decrement on single element [duplicate]单个元素的 std::map::iterator 递减[重复]
【发布时间】:2013-05-02 09:47:58
【问题描述】:

如果地图中只有一个元素,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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 在实际应用中,迭代器是从upper_bound返回的,所以在我们检查它不等于begin()之前,递减“一些迭代器”是非法的?
  • 它不是“非法的”,而是未定义的。但是,是的,您应该始终确保您没有递减指向 begin() 的指针。如果你这样做,你无法保证会发生什么,即使你将它增加回 begin()
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 2012-11-24
    • 2017-07-03
    • 2012-11-23
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多