map元素删除

map内部以RB-tree( 一种平衡二叉树)结构存储。应用时可以通过迭代器方便操作。但在移除元素时容易出现问题。

Code:
  1. typedef std::map< std::string, float > myMap;      
  2. myMap example;      
  3. myMap::iterator pos;      
  4. ......      
  5. for( pos = example.begin(); pos != example.end(); ++pos )      
  6.    if( pos->second == value )      
  7.    {      
  8.       example.erase( pos );//运行时错误.      
  9.    }    

对pos所指元素调用erase(), 会使pos不再是一个有效迭代器, 此后如果不对pos重新设置就使用pos,会导致未定义行为,比如++pos操作。

正确使用:

Code:
  1. for( pos = example.begin(); pos != example.end(); )   
  2.    if( pos->second == value )   
  3.      example.erase( pos++);    
  4.    else  
  5.      ++pos;  

此时,pos++会将pos指向下一个元素,并返回其原始值。

当调用erase()时,pos已经不再指向那个即将被删除的元素了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值