erase element during traversal

今天遇到一个问题就是遍历一个容器的时候删除应该怎么做。
这个其实是经常遇到的问题,但是没有总结。

如果C++11的话,非常方便,如下是C++ Primer推荐的方式(reference by 战神 and 炮哥)

for(map<int, int>::iterator it=hash1.begin();it!=hash1.end();)
{
    if(j%(it->f)==0 && (it->s)>=1)
    {
        it->s--;
        if(it->s==0)
        {
            it=hash1.erase(it);
            continue;
        }
    }
    it++;
}

因为删除后,当前迭代器失效了,然后返回下一个元素的迭代器,这样遍历正常运行,否则按照正常it++就好了 ,由于这个分治是两个if,因此代码用continue可能更方便些。

如果C++98的话,这种方式似乎是可以的,从博客 http://www.cnblogs.com/zhoulipeng/p/3432009.html

for(map<int, int>::iterator it=hash1.begin();it!=hash1.end();)
{
    if(j%(it->f)==0 && (it->s)>=1)
    {
        it->s--;
        if(it->s==0)
        {
            hash1.erase(it++);
            continue;
        }
    }
    it++;
}

主要是由于hihocode 不支持C++11,因此只能用C++98 的STL API,http://www.cplusplus.com/reference/map/map/erase/

另外还有一点就是关于continue的小细节
for(map::iterator it=hash1.begin();it!=hash1.end();)
{
if(j%(it->f)==0 && (it->s)>=1)
{
it->s—;
if(it->s==0)
{
it=hash1.erase(it);
continue;
}
}
it++;
}
如果it++放到for(;;)后面,那么continue的话,it++还是会执行的,所以要特别小心。

for(1;2;3){
  4
}

分组循环:[1,2] [4,3,2] [4,3,2]….
continue之后 由4跳到3。

Posted by richard爱闹 - 3月 8 2015
如需转载,请注明: 本文来自 Richard