您的位置:首页 > 其它

STL的list的erase问题

2013-05-26 16:58 162 查看


http://www.cnblogs.com/carekee/articles/1717921.html


list使用中遇到的erase问题(List Iterator Not Incrementable)

在VS2005中使用list的erase遇到了"List Iterator Not Incrementable"问题
举个例子:
1.
list<int> sList;

list<int>::iterator sP;
sList.push_back(1);

sList.push_back(3);

sList.push_back(5);

sList.push_back(7);
for (sP = sList.begin();sP!=sList.end();sP++)
{
  if(*sP == 3)
    sP = sList.erase(sP); //清除后,自动指向下一个结点
}
如果恰好不是在3不是在sList的结尾,这个没有什么问题;
关键是,如果是在结尾,请看:
2.
list<int> sList;

list<int>::iterator sP;
sList.push_back(3);
for (sP = sList.begin();sP!=sList.end();sP++)
{
  if(*sP == 3)
    sP = sList.erase(sP); //sP得值为负值
}
这样因为最后会再次执行一次循环,操作sP++,这时就会报错,因为此时sP已经无指向;
预防这种错误,如网上说的:
在执行sP = sList.erase(sP); //sP得值为负值
后面加入 sP--;更会出错;

最后的解决办法:
sList.push_back(3);
for (sP = sList.begin();sP!=sList.end();)

{

if (*sP == 3)

{

sP = sList.erase(sP); //sP指向下一个,如果sP当前指向为end的前一个,那执行完后,指向end

}

else

{

sP++; //如果上面没有执行,sP指向下一个

}

}
再测试,就没有问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: