首先通过一个例子看看迭代器失效的原因
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, char*> tmp_map;
tmp_map[0] = "hello";
tmp_map[1] = "world";
tmp_map[2] = "!";
for (map<int, char*>::iterator it = tmp_map.begin(); it != tmp_map.end(); it++)
{
tmp_map.erase(it);
}
return 0;
}
上面程序运行会崩溃,因为在第15行对迭代器 it 执行 erase() 后,该迭代器已经失效,不能在循环种对其进行++操作。
解决办法是在迭代器失效后重新赋值,或者删除临时迭代器。
失效后重新赋值的解决办法为:it = tmp_map.erase(it); erase() 会返回被删除的迭代器的下一个迭代器;
删除临时迭代器的解决办法为:tmp_map.erase(it++); it先指向下一个迭代器,然后返回当前迭代器。
如:
#include<stdio.h>
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, char*> tmp_map;
tmp_map[0] = "hello";
tmp_map[1] = "world";
tmp_map[2] = "!";
for (map<int, char*>::iterator it = tmp_map.begin(); it != tmp_map.end(); /*it++*/)
{
//it = tmp_map.erase(it);
tmp_map.erase(it++);
}
return 0;
}