VS上使用list等容器的迭代器对其遍历或者删除时报错

由于之前更多是使用dev,所以养成了很多编程陋习,最近趁着做图形学,强制自己好好练习使用Visual Studio,在使用list容器的迭代器的时候出现了一些意外。

//这段代码意在找出并且删除链表AET中结构体节点y值等于i的节点
for (auto erasep = AET.begin(); erasep != AET.end();erasep++ ) {
			if (erasep->y == i) AET.erase(erasep);
		}

在这里插入图片描述
这个错误翻译过来就是说:无法增量 值已经初始化的链表迭代器,也就是说链表迭代器无法自增,这是为什么呢?因为erase函数一旦执行,当前的迭代器就从链表AET中移除,因此for循环中就无法再对迭代器进行“++”操作了,所以改成下面所示就可以解决问题。

for (auto erasep = AET.begin(); erasep != AET.end(); ) {
			if (erasep->y == i) AET.erase(erasep--);//
			erasep++;
		}
//it--很重要,因为使用erase()删除it指向的字符后,后面的字符就移了过来,it指向的位置就被后一个字符填充了,而最后的it++,又使it向后移了一个位置,所以就忽略掉了填充过来的这个字符。在这加上it--后就和it++抵消了,使迭代器能够访问所有的字符。

另外还遇到一个小问题,以下代码也会报错

auto q=AET.begin();
auto nextq=q;
nextq++;

在这里插入图片描述
这个问题其实就是说无法确定这个nextq是否是AET.end(),如果是的话,此时自增肯定是无效的,所以这里只需要改成如下代码:

auto q = AET.begin(), nextq = q;
		if (nextq != AET.end())  nextq++;

这些经验对于vector,map也同样是适用的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值