c++ map循环删除

参考

http://t.zoukankan.com/riskyer-p-3343268.html

 

为什么

for(auto i=map.begin();i!=map.end();++i)
  if(i.first==value)    
    map.erase(i);

这种写法不行?

因为在这段代码中,i的自增是放在最后面执行的,当删除符合条件的i时,这个迭代器i也会被删掉,此时没办法对一个空地址进行自增操作,所以会报错

 

写法1

for(auto i=map.begin();i!=map.end())
    if(i.first==value)
        map.erase(i++);
  else
    i++;

i++的源码

{
    tmp=i;
    i=i+1;
    return tmp;
}

也就是说map删除的iterator还是我们要删掉的那个迭代器,但是在i被删除之前他已经完成自增了,所以不会出错

 

写法2

for(auto i=map.begin();i!=map.end())
{
    if(i.first==value)
        i=map.erase(i);
    else
        i++;
}

这个需要看erase函数的返回值,参考c++ reference

http://www.cplusplus.com/reference/map/map/

erase()返回的是被删除迭代器的下一个迭代器,因此也不会出错

posted @ 2021-12-29 11:17  Wangtn  阅读(708)  评论(0编辑  收藏  举报