迭代器失效问题

目录

插入失效

删除失效


插入失效

因为在 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值