1. vector遍历删除
1.1 错误的方法
vector<int> vec;
for (vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
vec.erase(it);
}
错误的原因是执行vec.erase(it)后,使得it已经失效,之后再循环会导致it++报错。
1.2 正确的方法
vector<int> vec;
for (vector<int>::iterator it=vec.begin();it!=vec.end();)
{
it = vec.erase(it); //或者vec.erase(it++);
}
2. map遍历删除
map遍历删除与vector存在同样的问题,解决方法也一样
2.1 错误的方法
int main()
{
std::map<int, int> mp{
{
1, 2}, {
2,3 }, {
3,4 }};
for (std::map<int, int>::iterator it = mp.begin(); it != mp.end();)
{
if (it->first == 2)
mp.erase(it);
it++;
}
for (auto &m : mp)
std::cout << m.first << std::endl;
return 0;
}
错误的原因是执行mp.erase(it)后,使得it已经失效,之后再循环会导致it++报错。
2.2 正确的方法
int main()
{
std::map<int, int> mp{
{
1, 2}, {
2,3 }, {
3,4 }};
for (std::map<int, int>::iterator it = mp.begin(); it != mp.end();)
{
if (it->first == 2)
it = mp.erase(it);//或者mp.erase(it++)
else
it++;
}
for (auto &m : mp)
std::cout << m.first << std::endl;
return 0;
}