list容器的删除单个元素操作的有关问题

list容器的删除单个元素操作的问题
本帖最后由 lwyhunter 于 2010-07-24 17:14:04 编辑
#include <iostream>
#include <list>
using namespace std;

int main()
{
int ia[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
list<int> ilist(ia, ia+12);

         list<int>::iterator liter = ilist.begin();

for ( ; liter!=ilist.end(); )
{
if (*liter%2)
{
ilist.erase(liter);
}
else
{
++liter;
}
}

for (liter=ilist.begin(); liter!=ilist.end(); ++liter)
{
cout << *liter << endl;
}
return 0;
}

这个程序在VC6编译通过,但运行时出了问题,可能是迭代器liter出了问题,但原因不知道,还请高手指点。本程序如果将list改为vector又能正常工作。
------解决方案--------------------
迭代器liter在list.erase后失效了。

你应该了解一下STL迭代器失效问题.
http://blog.csdn.net/oneVs1/archive/2009/04/28/4130391.aspx
------解决方案--------------------
是迭代器liter在erase()后失效。
#include <iostream>
#include <list>
using namespace std;

int main()
{
int ia[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
list<int> ilist(ia, ia+12);

  list<int>::iterator liter = ilist.begin();

for ( ; liter!=ilist.end(); )
{
if (*liter%2)
{
liter=ilist.erase(liter);//mark
}
else
{
++liter;
}
}

for (liter=ilist.begin(); liter!=ilist.end(); ++liter)
{
cout << *liter << endl;
}
system("pause");
return 0;
}

楼主看看
------解决方案--------------------
erase,pop_front和pop_back函数使指向被删除元素的所有迭代器失效。对于vector容器、指向删除点后面的元素的迭代器通常也会失效。而对deque容器,如果删除的不包含第一个元素或最后一个元素,那么该容器相关的所有迭代器都会失效