1. 迭代器失效的三种情况:
(1)当容器调用erase方法的时候,会造成删除点到容器末尾所有元素的迭代器都失效了。
(2)当容器调用insert方法的时候且不造成扩容情况,会造成插入点到容器末尾所有元素的迭代器都失效了。
(3)当容器调用insert方法的时候并且造成扩容的情况,会造成首元素到容器末尾所有元素的迭代器都失效了。
2. 如何解决容器迭代器失效问题?
对插入/删除点的迭代器进行更新。
下面我们将通过代码来加深对上述知识的理解。
usingnamespacestd; intmain() { vector<int>vec; for (inti=0; i<20; i++) { vec.push_back(rand() %100+1); } cout<<"删除前打印:"<<endl; for (auto&e : vec) // 删除前打印 { cout<<e<<" "; } cout<<endl; //删除所有偶数autoit=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的数字前增加一个数字6it=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; return0; }