c ++有没有可能`map.end()`在`std::map`的生命周期内改变

Posted

技术标签:

【中文标题】c ++有没有可能`map.end()`在`std::map`的生命周期内改变【英文标题】:c++ is there any possibility that `map.end()` can change during the life time of a `std::map` 【发布时间】:2021-02-18 06:47:58 【问题描述】:

只是想知道我是否有这样声明的地图,

map<int, int> my_map;

并将end()迭代器分配给一个变量,并且永不改变,

auto end_it = my_map.end()

然后我将通过多次擦除和插入my_map 来更改my_map, 在my_map 的生命周期内,以下内容是否始终保持正确?

end_it == my_map.end()

【问题讨论】:

这能回答你的问题吗? Iterator invalidation rules 另见Is end() required to be constant in an STL map/set? 【参考方案1】:

std::map::insert 保证:

没有迭代器或引用无效。

std::map::erase 保证:

对已擦除元素的引用和迭代器无效。其他引用和迭代器不受影响。

因此结束迭代器应该保持有效。如果您使用任何其他操作,您应该检查它是否可能使迭代器无效。

【讨论】:

以上是关于c ++有没有可能`map.end()`在`std::map`的生命周期内改变的主要内容,如果未能解决你的问题,请参考以下文章

JFrame(用C++11特性重构系列——DllParser的实现)

C ++,std :: list的左/右旋转

从满足谓词的无序映射中删除元素

C++17,制作一个使用依赖于模板参数的 std::variant 的可变参数模板?

std::set 插入器不尊重自定义比较器。 (可能的编译器错误?)

旧版c ++代码不包含std ::前缀