C++ STL极大的方便了用户编写程序,但是同时一不小心也会犯一些错误,如erase()造成迭代器失效经常会引起错误。
错误示例:
std::list< int> List; std::list< int>::iterator it; for( it = List.begin(); it != List.end(); it++) { if( it符合删除条件 ) { List.erase( it); } }
由于erase()之后对应位置的迭代器已经失效,这时itList++将无法找到下一个元素。
正确的使用方式是利用erase()的返回值为下一个有效的迭代器或者在调用erase()之前先找到下一个有效的迭代器
正确示例:
std::list< int> List; std::list< int>::iterator it; for( it = List.begin(); it != List.end(); ) { if( it符合删除条件 ) { it = List.erase(it); } else it++; }
或者
std::list< int> List; std::list< int>::iterator it; for( it = List.begin(); it != List.end(); ) { if( it符合删除条件 ) { List.erase( it++); } else it++; }
原文:http://www.cnblogs.com/bewolf/p/5128559.html