1. 迭代器失效的三种情况:
(1)当容器调用erase方法的时候,会造成删除点到容器末尾所有元素的迭代器都失效了。
(2)当容器调用insert方法的时候且不造成扩容情况,会造成插入点到容器末尾所有元素的迭代器都失效了。
(3)当容器调用insert方法的时候并且造成扩容的情况,会造成首元素到容器末尾 所有元素的迭代器都失效了。
2. 如何解决容器迭代器失效问题?
对插入/删除点的迭代器进行更新。
下面的代码将有利于你理解上述知识。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
for (int i = 0; i < 20; i++)
{
vec.push_back(rand() % 100 + 1);
}
cout << "删除前打印:" << endl;
for (auto& e : vec) // 删除前打印
{
cout << e << " ";
}
cout << endl;
//删除所有偶数
auto it = vec.begin();
while (it!=vec.end())
{
if (*it % 2 == 0)
{
it = vec.erase(it);// 此时删除点到容器末尾的所有迭代器失效,需要对迭代器进行更新操作,
//观察erase方法可以发现它可以返回一个的是下一个有效迭代器的位置,所以我们可以将erase(it)对it进行重新赋值以达到更新it的目的!
}
else
{
it++;
}
}
cout << "删除后打印:" << endl;
for (auto& e : vec) // 删除后打印
{
cout << e << " ";
}
cout << endl;
//在大于5的数字前增加一个数字6
it = vec.begin();
while (it != vec.end())
{
if (*it > 5)
{
it = vec.insert(it,6);
it++;
it++;
}
else
{
it++;
}
}
cout << "增加后打印:" << endl;
for (auto& e : vec) // 删除后打印
{
cout << e << " ";
}
cout << endl;
return 0;
}