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

VC++ 6.0模板库深度解析:核心组件、陷阱规避与实战调优 标准模板库(STL)作为C++泛型编程的核心,通过容器、迭代器、算法和函数对象四大组件,实现了数据结构和算法的通用化与高效复用。其原理基于模板元编程,通过编译时多态提升代码复用性和运行效率,技术价值在于显著减少重复代码、提高开发效率并优化程序性能。在工程实践中,STL广泛应用于系统开发、游戏引擎、嵌入式软件等需要高性能数据处理的场景。本文聚焦于Visual C++ 6.0这一特定历史环境下的模板库实现,深入剖析其与现代STL的差异,并针对迭代器失效、模板编译模型等常见陷阱提供实战解决方案,帮助开发者高效维护 阅读详情

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

再测试,就没有问题了。

C++ Runtime Error :STL list "list iterator not incrementable" 问题最近在项目过程中用到了list这个容器,并且在使用过程中涉及了erase的删除元素操作,在程序的调试过程中经常会弹出异常对话框,提示的异常为:“list iterator not incrementable”,便上网查了一下问题的原因,网上的答案一致认为是遍历容器元素的时候使用erase删除元素,导致++iterator 的时候报了刚才的错误…… 阅读详情

相关推荐

关于list iterator not incrementable的解决方法

关于list iterator not incrementable的解决方法1.错误源码2.错误分析3.修正 编译环境:VS2015 语言:C++ 参考博客:https://blog.csdn.net/qingtianweichong/article/details/9531919 话休絮烦,直接贴上报错图片: 看到list字样,应该是list容器部分出现了问题。下面贴出使用list容器的代码块: 1.错误源码 双向链表list及迭代器声明部分: list<Bullet*> m_bullet

Alan_Walker_One的博客 1250

STL-list错误:list iterator not incrementable

使用STL的list容器时报错,具体内容如下:错误图:分析:迭代没法再自增了。代码部分:在遍历时用了erase函数,会把迭代器弄乱。无法继续进行,因此,删除完后加上break,别让它继续查找即可。有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。...

关注网络安全、云原生安全 1162

list iterator not incrementable

这个问题的字面意思就是迭代器不能增加了。我查了一下发现了两种原因可导致这个问题。 第一个就是一个空的list,用一个迭代器指向list的begin(),然后执行迭代器的自增加。 另一个就是网上大多数的调用listerase()操作的时候会有这个问题

xunathan的专栏 1255

如何避免“iterator not incrementable”错误

        最近加入了公司的一个移植项目,目标是把原来在PC平台上的程序放到360上运行。客户给的是PC上的代码和数据,编译过后就能够跑了。但是程序运行时,偶尔会报告错误。在VS2010启动的情况下,可以看到Debug游标停在对一个++Iterator的操作上。因为是调试版本,所以代码中额外添加了对Iterator的检查部分,具体信息是:”list iterator notincrementa...

hsujouchen的专栏 2万+

vs2005里List Iterator Not Incrementable

 vs2005里List Iterator Not Incrementable? 当需要erase list里的元素时代码可写为以下形式,可避免list iterator incrementablestd::list T;std::list::iterator rpos;for(rpos=T.begin();rpos!=T.end();){    rpos = T.er

Richard的专栏 2606

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

使用容器中的erase遇到"List Iterator Not Incrementable"问题,正确食用erase的姿势,以list为例 举个例子: 1. list sList; list::iterator sP; sList.push_back(1); sList.push_back(3); sList.push_back(5); sList.push_back(7); f

迷路的专栏 770

List Iterator Not Incrementable

在VS2005中使用listerase遇到了"List Iterator Not Incrementable"问题 举个例子: 1. list sList; list::iterator sP; sList.push_back(1); sList.push_back(3); sList.push_back(5); sList.push_back(7); for (sP =

yuan_hs_hf的专栏 703

C++ list iterator not incrementable 不是erase的情况

//下面的程序在执行最后一句,取值的时候,会弹出list iterator not incrementable的错误,发现把pnlist=peek.begin()那一句,移动到后面,就不会出这个错误了。(注掉那个地方)//不是说list在push的时候,不会影响表首的地址吗 list peek; list::iterator pnlist; pnlist = peek.be

qq_39760867的博客 681

迭代器失效 iterator not incrementable

for (vector::iterator it = vtest.begin(); it!= vtest.end(); it++){ vtest.erase(it); } 当迭代器直接用于earse时,迭代器将失效,引发 iterator not incrementable ; 解决方法如下: for ( std::list::iterator it =ObjList.beg

weileze的专栏 277

vector iterator not incrementable错误解决

原出处:http://www.cnblogs.com/azor/p/3591062.html 2014/03/11更新:循环删除容器中符合条件的元素   《C++ Primer(Edit 5)》, P.349   Both forms of erase return an iterator referring to the location after the(last)

ss_shine6的博客 1177

C++23新算法解析:ranges::iota与shift_left/right实战指南

在C++编程中,序列生成和元素移位是数据处理和算法设计的常见需求。传统上,开发者可能依赖手动循环或组合多个标准库算法来实现这些操作,但代码往往冗长且意图不够清晰。C++20引入的Ranges库通过提供范围(Range)抽象和视图(View)适配器,显著提升了代码的表达力和组合能力。在此基础上,C++23进一步丰富了算法家族,新增了`ranges::iota`、`ranges::shift_left`和`ranges::shift_right`这三个专门针对范围操作的算法。这些算法不仅提供了更符合现代C++范

clhq71932的博客 457

C++ STL迭代器相关

map 以下代码在编译时出错,提示c++map报错 map/set iterators incompatible map<string, int>::iterator it = GetFuncMap().begin(); while (it != GetFuncMap().end()) { //.......处理一些事情 ite++; } 原因:直接调用两次Get...

much efforts, much luck 424
上一篇: 重大发现:VC++2005,2008或更高版本 之list iterator not incrementable 错误原因
下一篇: vs2010生成mfc无法标记菜单
human_cn
博客等级 码龄16年 9粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值