[英]iterator invalidation in map C++
我有一个示例程序,我试图在从地图中删除元素时看到迭代器如何失效。
该计划在这里:
#include <iostream>
#include <map>
using namespace std;
int main(int argc, char *argv[])
{
map<int, int> myMap;
myMap.insert(pair<int, int>(0, 2));
myMap.insert(pair<int, int>(1, 4));
myMap.insert(pair<int, int>(3, 18));
myMap.insert(pair<int, int>(2, 20));
map<int, int>::iterator it;
for(it = myMap.begin(); it != myMap.end(); ++it)
{
myMap.erase(it); // erasing the element pointed at by iterator
cout << it->first << endl; // iterator is invalid here
}
return 0;
}
问题是我得到的输出是:
0
1
2
3
为什么迭代器不会失效并给我错误的结果。 任何帮助将受到高度赞赏。
C ++ STL映射的文档说:擦除元素的引用和迭代器无效。 其他引用和迭代器不受影响。
使用无效的迭代器是未定义的行为 。 在这种情况下,任何事情都可能发生
你为什么看到价值观? 迭代器包含指向某段内存的指针, 纯属意外 ,此内存尚未返回系统并且尚未被覆盖。 这就是为什么你仍然可以看到已经“死”的值。
它不会改变任何东西,它仍然是未定义的行为,并且下次运行程序时,map元素所在的内存页面可能已经再次返回到操作系统,并且您获得了访问冲突(分段错误)...
无效的迭代器并不意味着其内部数据已被删除。 有时在这种情况下,无效的迭代器可以保存对下一个项的有效引用。 但是,像这样使用它是未定义的行为,它可能会在您的应用程序中导致一些问题。
默认情况下,没有对无效迭代器的运行时检查。
您可以使用-D_GLIBCXX_DEBUG
为GNU C ++标准库启用无效迭代器的调试检查。 这会产生以下运行时错误:
iterator "this" @ 0x0x7fff9f3d7060 {
type = N11__gnu_debug14_Safe_iteratorISt17_Rb_tree_iteratorISt4pairIKiiEENSt7__debug3mapIiiSt4lessIiESaIS4_EEEEE (mutable iterator);
state = singular;
references sequence with type `NSt7__debug3mapIiiSt4lessIiESaISt4pairIKiiEEEE' @ 0x0x7fff9f3d7150
}
对于其他标准库,请查看文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.