C++ map顺序删除节点容易出bug

c++ c++ 1020 人阅读 | 0 人回复

发表于 2024-2-23 18:17:13 | 显示全部楼层 |阅读模式

c++ map, mutimap删除问题
  1. map<string, string>::iterator iter;
  2. for ( iter = mm.begin();iter != mm.end(); iter ++ )
  3. {
  4.     if ( iter->second == something )
  5.     {
  6.         mm.erase( iter );
  7.     }
  8. }
复制代码
这样删除会导致程序内存覆盖等一系列不可预知的bug。
原因:当erase掉iter后,继续执行iter++,这个时候就乱套了

正确方法:

  1. for (iter = mm.begin();iter != mm.end();)
  2. {
  3.     if ( iter->second == something )
  4.     {
  5.         mm.erase( iter++ );
  6.     }
  7.     else
  8.     {
  9.         iter++;   // Use Pre Increment for efficiency.
  10.     }
  11. }
复制代码

可能有人不理解mm.erase(iter++)
其实和这个是一样的

  1. for (iter = mm.begin();iter != mm.end();)
  2. {
  3.     if ( iter->second == something )
  4.     {
  5.                     map<string, string>::iterator iter_erase;
  6.                     iter_erase = iter++ //先保存后++再删除
  7.         mm.erase( iter_erase );
  8.     }
  9.     else
  10.     {
  11.         iter++;   // Use Pre Increment for efficiency.
  12.     }
  13. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则