容器中使用erase的正确姿势(List Iterator Not Incrementable)

原创 2015年06月01日 11:12:53
使用容器中的erase遇到"List Iterator Not Incrementable"问题,正确食用erase的姿势,以list为例

举个例子:

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指向下一个
  }
 }

再测试,就没有问题了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

STL list "list iterator not incrementable"

这几天在vc.net下写一个小东西,涉及到list的使用.程序运行到使用erase删除list中某个元素的时候,会弹出异常对话框,提示的异常为:”list iterator not increment...
  • jiyanfeng1
  • jiyanfeng1
  • 2012年11月22日 15:40
  • 3634

iterator not incrementable 解决方案

今天写了这样的一段代码:for (auto it = m_vecBall.begin(); it != m_vecBall.end();) { auto x = (*it)->...
  • u011488256
  • u011488256
  • 2016年02月02日 18:06
  • 728

c++ X STL - Traverse List and Delete Node , Error list iterator not incrementable

Container Traverse for(iterator it = begin(); it != end(); ++it) for(iterator it = begin(); it...
  • blizmax6
  • blizmax6
  • 2011年09月24日 06:48
  • 2938

关于vector iterator not incrementable的解决方案

第一次写博客,突然有点小紧张。 不算是什么原创内容,也算是网上找到的各种答案,总结一下吧。 在使用迭代器时还是有很多问题要注意的,稍不注意,就会出现恶心的runtime error。这些错误不像一般的...
  • keyboardFucker
  • keyboardFucker
  • 2016年07月29日 22:21
  • 1909

vector iterator not incrementable 的问题

当使用vector #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { list slist; list:...
  • KUAILE123
  • KUAILE123
  • 2013年09月05日 09:03
  • 6977

map/set iterator not incrementable

1、报错       “map/set iterator not incrementable”,程序运行至一般报错       for (ActionBindings::const_ite...
  • liminled
  • liminled
  • 2014年01月13日 22:24
  • 5260

STL 使用 erase 删除元素时 iterator 失效

STL中的容器按存储方式分为两类:一类是序列容器(如:vector,deque),另一类是关联容器(如:list,map,set)。 在使用erase方法删除元素时,有几点需要注意: 1) 对于...
  • hellokandy
  • hellokandy
  • 2016年08月26日 13:58
  • 1031

关于错误map/set iterator not incrementable

今天Debug代码时,碰到一个关于迭代器的崩溃错误(仅限Debug模式,release会被容错):map/set iterator not incrementable,相关代码如下(仅演示思路代码):...
  • beyongwang
  • beyongwang
  • 2016年11月07日 23:54
  • 679

在遍历中使用 iterator/reverse_iterator 进行 Erase 的用法

众所周知,在使用迭代器遍历 STL 容器时,需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形。下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时,正确更新迭代器的用法。首先,要明...
  • kesalin
  • kesalin
  • 2014年04月21日 20:02
  • 29751

list iterator not dereferencable

zhuy
  • wangningningyc
  • wangningningyc
  • 2014年07月03日 13:48
  • 1358
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:容器中使用erase的正确姿势(List Iterator Not Incrementable)
举报原因:
原因补充:

(最多只允许输入30个字)