目录
插入失效
因为在 insert 时, vector 可能需要进行扩容,而扩容的本质是 new 一块新的空间,再将数据迁移过去。而我们知道,迭代器的内部是通过指针访问容器中的元素的,而插入后,若 vector 扩容,则原有的数据被释放,指向原有数据的迭代器就成了野指针,所以迭代器失效了。
删除失效
对于序列式容器(如 vector , deque ),列式容器就是数组式容器,删除当前的 iterator 会使后面所有元素的 iterator 都失效。这是因为 vector , deque 使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用 erase ( iter ++)的方式, erase 方法可以返回下一个有效的 iterator,所以可以对iter重新赋值。
#include<iostream>
#include<vector>
using namespace std;
void pvec(vector<int> &v)
{
vector<int>::iterator it=v.begin();
for(;it!=v.end();it++)
{
//*it==int
if(it==v.begin())
cout<<*it;
else
cout<<" "<<*it;
}
cout<<endl;
}
//迭代器插入失效
void test01()
{
vector<int>v;
int a[]={1,2,3,4};
v.assign(a,a+4);
pvec(v);
vector<int>::iterator it=v.begin();
//v.insert(it+2,9);
it=v.insert(it+2,9);//通过重新对it赋值,确定其位置
cout<<*it<<endl;
}
//迭代器删除失效
void test02()
{
vector<int>v={1,2,3,4,4,4,4,5,6};
vector<int>::iterator it=v.begin();
// for(;it!=v.end();it++)
// {
// if(*it==4)
// {
// v.erase(it);
// }
// }
for(;it!=v.end();)
{
if(*it==4)
{
it=v.erase(it); //重新对it的位置进行赋值
}
else
{
it++;//不删除的时候it才往后移
}
}
pvec(v);
}
int main()
{
test02();
return 0;
}