关于STL常用容器的erase使用陷阱

在工作中,有些常用语句拈手即来,比如 m_testList.erase(it++); 虽然erase会导致迭代器失效,但是it++就可以保证it指向循环的下一个位置。因为it++实际上erase调用的是拷贝构造的一个临时迭代器,it在进行删除操作之前已正确指向下一个对象。在以前多次使用,都没有出现问题,今天却突然遇到了bug。

经验证,erase在map、list等容器中,使用erase(it++);方式循环删除操作完全没有问题;但是在vector是不支持的。个人理解:vector在擦除后,因为是顺序存储,所以后面的位置前移;it++后已经指向下一个对象的位置了,之后线性存储数据前移,导致跳过一个元素,如果跳过的碰巧是end(),那么就当然会core了。当然这种默认变动,是和编译器有关,部分编译器可能会优化可能不会,所以靠谱的写法应该是it = m_testList.erase(it);

然而在map中,这种语句却又不支持,map的erase是没有返回迭代器下一个位置。

所以两种写法,在工作中都会用到。需要特别注意就是循环删除的时候,iterator不要两次++。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值