C++ STL 迭代器删除问题总结
来源:互联网 发布:发乎于情止乎于礼全文 编辑:程序博客网 时间:2024/05/02 04:43
iterator erase( iterator pos );
对C++ STL中迭代器的删除需要慎重,如上方法。
1、vector
vector在遍历中进行 erase(pos) ,这个时候iter++的时候会出现bug,会跳过一个字段或者coredump。
解决方法:(要删除的时候直接赋值返回值,但是不能++)
vector<int>::iterator iter2;for(iter2 = vec.begin(); iter2 != vec.end(); ){ printf("%d " , *iter2 );
//注意这里 if( *iter2 == 3 ){ iter2 = vec.erase( iter2 ); }else{ iter2++; }}
2、list
list在遍历中进行 erase(pos) ,这个时候iter++的时候会出现bug,会直接coredump。
解决方案:
list<int>::iterator iter2;for(iter2 = vec.begin(); iter2 != vec.end(); iter2++){ printf("%d " , *iter2 ); if( *iter2 == 3 ){ vec.remove( *iter2 ); //注意这里,调用remove( const TYPE &val ); }}
3、map
list在遍历中进行 erase(pos) ,这个时候iter++的时候会出现bug,会出现未知问题。
解决方案:
map<int,int>::iterator iter;for(iter = testMap.begin(); iter != testMap.end(); iter++){ printf("%d " , iter->second ); if( iter->second == 3 ) { testMap.erase( iter->first ); //注意这里,是通过key删除 }}