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
{
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。