【c++】vector中迭代器失效问题
通常会出现迭代器失效的情况:
(1)insert时(可能会增容),增容后会出现野指针,从而引发迭代器失效;
(2)erase时(vs报错,但linux并不一定报错),如果删的是最后一个位置,就会会出现越界的情况,也就是空间不够,从而引发迭代器失效;
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void test_vector2()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.insert(v.begin(),0);//在当前位置的前一个进行插入
v.insert(v.end(), 5);
//想在某个值的前面插入一个数,这个时候得先找到这个数的位置才能进行插入
//①
/*auto it = v.begin();
while (it != v.end())
{
if (*it == 3)
{
v.insert(it, 30);
break;
}
else
{
it++;
}
}*/
//②
auto it = find(v.begin(),v.end(), 3);//这个接口的使用需要引<algorithm>头文件
if (it != v.end())
v.insert(it, 30);
else
cout << "没有找到" << endl;
//如何删除掉3?
//如果不加:it = find(v.begin(), v.end(), 3)这一句的话,因为it经历了上面的insert之后,it就成了失效的迭代器
//怎么理解这儿的迭代器失效呢?
//迭代器失效是由insert(因为insert时可能会增容)引发的,这时候会出现野指针,也就是迭代器失效
//所以,在insert之后,就不要再去访问迭代器了,因为insert之后可能会增容,从而导致迭代器失效,为了避免这个问题,我们可以重新找这个迭代器的位置,这样就不会引发迭代器失效问题了
/*it = find(v.begin(), v.end(), 3);
v.erase(it);*/
//要求删除所给数据中所有的偶数:(这种情况下,也会导致迭代器失效,具体原因如下图分析:)
it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
v.erase(it);
it++;
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
}
int main()
{
/*test_vector1();*/
test_vector2();
system("pause");
return 0;
}
分析:
总之一句话,在insert之后或者erase一个迭代器之后,这个迭代器就不要再使用了,否则就会有风险。
说了这么多,我们只需记住,只要insert或者erase之后,迭代器就失效了,失效就意味着不能再去访问这个位置,否则就可能会出问题。