Erase导致的迭代器失效分析(C++11)

循环中的erase:

(1)对于关联式容器,erase之后什么也不返回,则后续的迭代器无法向下,即不能在执行++it或it--操作。需要做的是在删除时,进行it++,让迭代器走下去就OK。

(2)对于序列式容器,erase之后返回的是下一个迭代器,但会导致后续的迭代器全部失效,此时如果想要循环继续,要保存迭代器的返回值,从此处开始迭代。

无论哪种容器,常规的三段式for( )都不再适用。

在C++11中,erase返回下一个迭代器,但之前的版本都返回void。erase本来就设计得不好,这下更容易让人犯错误了。有缺陷的C++!

void erase( iterator pos );
 (until C++11)
iterator erase( const_iterator pos );
 (since C++11)

void erase( iterator first, iterator last );
 (until C++11)
iterator erase( const_iterator first, const_iterator last );
 (since C++11)

但目前很多编译器还不支持C++11,或者只是部分支持。所以还是采用最稳妥的办法好,即把 it++ 写在循环之外。

(1)关联式容器(以map为例)

for ( it=map.begin() ; it != map.end() ;  )

{

if ( canDelete(it) ) map.erase( it ++) ; //在c++11中,完全可以只写map.erase( it ) 即可,但要先确认你的编译器支持C++11,例如g++ 4.7.3就不行

else ++it ;

}

(2)序列式容器(以vector为例)

for( it = vector.begin() ; it != vector.end() ; )

{

if ( canDelete(it) )   it = vector.erase( it ) ; //要把返回的值保存在 it 中 ,否则 it 将处于无效状态 ,之后的 ++it 将没有意义。C++11关联容器也可这么写

else ++ it ;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值