vector迭代器失效问题(insert、erase)
erase方法可以返回下一个有效的iterator。
我们用代码的形式呈现给大家:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int a[] = { 1, 2, 3, 4 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
//使用find查找3所在的位置的iterator
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
//删除pos位置的数据,导致迭代器失效
v.erase(pos);
cout << *pos << endl;//此处会导致非法访问,因为3已经被删了再去访问就会有问题
//在pos位置插入数据,导致pos迭代器失效
//insert会导致迭代器失效,是因为insert可能会导致增容,增容后pos还指向原来的位置,而原来的空间已经释放了
pos = find(v.begin(), v.end(), 3);
v.insert(pos, 30);
cout << *pos << endl;//此处会导致非法访问
return 0;
}
那我们举个栗子来体验一下迭代器失效的过程:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int a[] = { 1, 2, 3, 4 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
//实现删除v中所有偶数
//下面的程序会崩溃,如果是偶数。erase导致it失效
//对失效的迭代器进行++it,会导致程序崩溃
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
{
v.erase(it);
}
++it;
}
//以上程序要改成下面那样,erase会返回删除位置的下一个位置
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
{
it = v.erase(it);
}
else
{
++it;
}
}
return 0;
}