① 对于序列容器vector,deque,erase之后,后面的每个元素的迭代器都会失效,iter成为野指针,此时如果对iter操作会出错
示例1:
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
void print(int n)
{
cout << n << " ";
}
int main(int argc, char** argv)
{
int arr[6] = { 1, 2, 3, 3, 4, 3 };
vector<int> vc(arr, arr + 6);
vector<int>::iterator iter;
for (vector<int>::iterator iter = vc.begin(); iter != vc.end(); iter++)
{
if (3 == *iter)
{
vc.erase(iter);
}
}
for_each(vc.begin(), vc.end(), print);
system("pause");
return 0;
}
编译OK,运行报错。
vc.erase(iter)
执行之后,iter
就变成了野指针,对一个野指针进行iter++
操作肯定会出错。
正确示例:
for
语句里面删除元素时,返回值指向已删除元素的下一个位置,不是删除元素是直接进行++
操作。
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
void print(int n)
{
cout << n << " ";
}
int main(int argc, char** argv)
{
int arr[6] = { 1,2,3,3,4,3 };
vector<int> vc(arr, arr + 6);
vector<int>::iterator iter;
for (vector<int>::iterator iter = vc.begin(); iter != vc.end(); )
{
if (3 == *iter)
{
iter = vc.erase(iter);
}
else
{
++iter;//在for循环最后不写++,而是在这里写
}
}
for_each(vc.begin(), vc.end(), print);
system("pause");
return 0;
}
可以参考小米2021春招 字符串筛选
② 对于关联容器map,set
//erase方法调用————循环中局部删除某些元素
std::map<int, int> b;
b[1] = 5;
b[2] = 6;
b[3] = 7;
b[4] = 8;
for (std::map<int, int>::iterator iter = b.begin(); iter != b.end();)
{
if (iter->first % 2 == 0)
{
iter = b.erase(iter);//这个只有在C++11才能有效
//b.erase(iter++);//这个是旧版的也有效(注意必须是要这样的形式,b.erase(iter), i++;的形式都编译不通过)
}else
++iter;
}
}