map元素删除

来源:互联网 发布:淘宝网户外音响长红 编辑:程序博客网 时间:2024/05/10 23:26

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已经不再指向那个即将被删除的元素了。

原创粉丝点击