容器中使用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指向下一个
  }
 }

再测试,就没有问题了。

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

相关文章推荐

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...

C++ Runtime Error :STL list "list iterator not incrementable"

问题最近在项目过程中用到了list这个容器,并且在使用过程中涉及了erase的删除元素操作,在程序的调试过程中经常会弹出异常对话框,提示的异常为:“list iterator not incremen...

C++ STL容器中erase的使用

erase()函数的功能是用来删除容器中的元素 函数原型: iterator erase(iterator where); iterator erase(iterator first,i...

如何避免“iterator not incrementable”错误

最近加入了公司的一个移植项目,目标是把原来在PC平台上的程序放到360上运行。客户给的是PC上的代码和数据,编译过后就能够跑了。但是程序运行时,偶尔会报告错误。在VS2010启动的情况下,可以看到De...

使用C++的map容器遇到的bug(map/set iterator not dereferencable)

最近使用C++,程序中使用了map容器,提示错误map/set iterator not dereferencable。 刚开始很是疑惑

map常用成员(关联容器)----创建map<主键,主键对应的值>,增insert,删erase,改查找find,然后修改second,遍历iterator,获取元素个数size,判空empty

map是STL的一个关联容器,它提供一对一(第一个字段为关键字,每个关键字只能在map中出现一次,第二个字段称为该关键字的值)的数据处理能力,由于这个特性 map内部的实现自建一颗红黑树(一种非严格...

STL各种容器如何正确的erase

STL中结点类容器(如:list,hash_map)遍历时进行删除时,需要这样做:  for(list ::iterator   iter   =   m_list.begin();   it...

effective stl:确保容器中对象副本正确而高效

1. 容器中保存了对象,但并不是你提供给容器的那些对象。而当从容器中取出

关于List容器的erase

之前在程序里面使用了list容器,其中用到了erase()函数,之前一直没出现问题,这两天突然莫名奇妙。花了点时间,搞清楚了erase()函数的机理。        常用的删除容器中元素的方法是如下...

【干货合集】阿里云专家诠释持续集成与云端交付的正确姿势:在云上如何欢快的用好容器服务?

阿里云专家将通过DevOps与阿里云容器服务、持续集成、运维三大块来为大家讲解。 DevOps与阿里云容器服务 1. DevOps与阿里云容器服务(一) DevOps(英文Devel...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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