vector的迭代器失效问题有两种情况
1.erase使迭代器失效
通过迭代器得到改元素的位置,erase掉该元素,再通过迭代器访问该位置就会出现非法访问。
2.insert使迭代器失效
insert操作可能会导致vector增容,从而申请新的空间,释放旧的空间,原来的迭代器还是指向原来旧的空间,继续访问就是非法。
请看代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int a[] = { 1, 2, 3, 4 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
//使用find找到3所在的位置
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
//1.
//删除pos位置的数据,导致pos迭代器失效。
//v.erase(pos);
//cout << *pos << endl;//此时会非法访问
//2.
//在pos位置插入数据,导致pos迭代器失效
//insert会导致迭代器失效,是因为insert可能会导致增容,
//增容后pos还指向原来的空间,而原来的空间已经被释放掉
//pos = find(v.begin(), v.end(), 3);
//v.insert(pos, 30);
//cout << *pos << endl;//此处非法访问
return 0;
}