【发布时间】:2018-04-18 09:02:19
【问题描述】:
我有一个示例程序,我试图在其中查看迭代器在从地图中删除元素时如何失效。
程序在这里:
#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 映射的文档说:引用和迭代器 擦除的元素无效。其他引用和迭代器 不受影响。
【问题讨论】:
-
您在问为什么有时使用无效的迭代器有效?这有点像在问为什么人们在不带降落伞的情况下有时能活下来
-
您的迭代器已失效。您正在观察未定义行为的影响。
-
取消引用无效的迭代器是未定义的行为。它可以做任何事情,包括返回(看似)正确的值。
-
那么,你是说它确实无效?
-
是的,您正在调用未定义的行为。