本人最近工作中用到std::list,在删除元素时用到以下
for( iterator= List.begin(); iterator!= List.end(); iterator++)
{
if( iterator->nIndex == nIndex)
{
List.erase( iterator);
}
}
结果可想而知,程序异常。在查找网上资料后知道erase方法使用不对,到了现在还犯这种错误,汗颜!吸取教训~
下面将所找的资料贴出来,写的很明白,就不再敷述。
===========================================================================================
【http://www.jb51.net/article/37437.htm】
基于C++ list中erase与remove函数的使用详解
erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器。
如下:
复制代码代码如下:
list ParticleSystem;
list::iterator pointer;
if(pointer->dead == true)
{
pointer = ParticleSystem.erase(pointer);
}
有一段关于错误使用erase的程序
复制代码代码如下:
using namespace std;
int main()
{
std::listtest_list;
std::list::iterator test_list_it;
test_list.push_back(1);
test_list_it = test_list.begin();
for(;test_list_it != test_list.end();test_list_it++)
{
test_list.erase(test_list_it);
}
}
问题: 该程序不能跳出循环
原因: test_list.erase(test_list_it);每次做erase时都有可能使迭代器失效,test_list_it++就发生错误了。可以参见effective stl一书。所有容器做erase操作时都有可能使迭代器失效。