std::vector的erase的问题

在利用iterator遍历vector并且删除其中一个元素的时候,发生了错误。

错误代码如下:

	vector<int> vec = { 1, 3, 34, 44, 3, 5 };
	for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++) //erase以后执行it++报错
	{
		if (3 == *it)
		{
			cout << "find one" << endl;           
			vec.erase(it);                       
		}
	}

出错原因:

执行了erase操作之后,迭代器it失效。因为当前的迭代器it是一个无效的迭代器,故不可执行 it++操作;

修正代码:

vector<int> vec = { 1, 3, 34, 44, 3, 5 };
	for (vector<int>::iterator it = vec.begin();it < vec.end();it++)
	{
		if (3 == *it)
		{
			cout << "find one" << endl;             //第一步:找到了要删除的位置
			auto temp = it;                         //第二步:删除后当前的it会失效。 所以可以定义一个临时变量
			it--;                                          
			vec.erase(temp);                        //第三步:正确删除
		}
	}


---------------------------------分割线-----------------------------------------------------------------------------------------------

自己的猜测:

vector里的迭代的的实现可能类似链表,迭代器里面存储的元素包括前一个元素的地址,自己本身元素的地址,以及后面一个元素的地址。

如下: frontPointer   selfPointer  behindPointer

当执行erase操作时,就相当于执行了链表里面的删除操作。

比如:删除了第三个元素,那么更改了第二个元素的behindPointer和第四个元素的frontPointe。

           并且把自己本身的的frontPointer   selfPointer  behindPointer都删除掉。

因此:当我们执行it++这个操作的时候,就相当于去访问垃圾内存。


erase的时候会不会把it本身的内存数据也删除了?



反驳:如果说iterator是一个类似链表结构的对象,那么如何解释 it++操作,*it操作?运算符重载?


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值