关于vector iterator not incrementable的解决方案

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

第一次写博客,突然有点小紧张。

不算是什么原创内容,也算是网上找到的各种答案,总结一下吧。

在使用迭代器时还是有很多问题要注意的,稍不注意,就会出现恶心的runtime error。这些错误不像一般的error那么友好,他们不会提示哪里出错。


1.在erase元素的时候,应该注意迭代器越界的问题,如   

  1. for (auto it = vec.begin(); it != vec.end(); ++it){
  2. if (*it == 2) vec.erase(it);
  3. }
这样的写法是错误的。
在执行完erase操作后,原来的迭代器it就失效了,其行为是不可预测的。
而erase操作会返回下一个迭代器,所以正确的做法应该是
  1. for (auto it = vec.begin(); it != vec.end(); ){
  2. if (*it == 2)
  3. it = vec.erase(it);
  4. else
  5. ++it;
  6. }

2.另一个出现incrementable的原因是, 在进行迭代器遍历容器时,原来的容器不应该再继续压入任何元素了,不然容器的长度变了,迭代器就失效了。
补救的方法是,每次压入vector时,都把迭代器重置
  1. for (auto it = vec.begin(); it != vec.end(); ++it){
  2. vec.push_back(1);
  3. it = vec.begin();
  4. }
但是这样造成的死循环问题也要避免。

还有就是对于STL的使用还不熟,稍微一不注意就会踩坑。
准备抽个时间系统的学习下。
C++ 使用vector 出现"vector iterator not incrementable"或"vector iterator + offset out of range"错误的情况 测试代码1:  vector g_vtStr1; vector g_vtStr2; vector g_vtStr3;   g_vtStr1.push_back(_T("Test1"));     g_vtStr1.push_back(_T("Test2"));     g_vtStr1.push_back(_T("Test3"));     g_vtStr1.push_ba 阅读详情

相关推荐

特殊的C++vector容器迭代器失效情况:vector iterator not incrementable

众所周知,容器删除元素会使当前使用的迭代器失效

m0_60352504的博客 686

在用vector 迭代器遇到“vector iterator not incrementable”错误解决办法

1.使用vector的迭代器erase元素的时候,应该注意迭代器越界的问题,eg:   for ( auto it = vec.begin();  it != vec.end();  ++it ){ if ( *it == 2 )  vec.erase(it); } 这样操作会报错“vector iterator not incrementable”; 原因:在执行完era

sun小武 3759

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

vector iterator not incrementable 的问题

当使用vector #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { list slist; list::iterator iter; slist.push_back(1); slist.push_back(5); slist.push_back

KUAILE123的专栏 9723

vector iterator not incrementable

原帖由 tyc611 于 2008-9-4 17:58 发表  只想着逃避问题而不是解决问题  以调试模式运行,遇到断言失败中断定位到断言失败的地方,再查看函数调用栈,找到自己程序中出错的地方,然后分析错误解决之 唉,我的程序是没有错的,标准的C++ STL,在GCC下编译运行的好好的 现在到vc下就不行了,出错在一个vectoriterator的遍历的时候 运行的时候

雄鹰 工作室 2715

C++出现错误:iterator not incrementable

想要实现一个函数,其功能:删除输入的set容器中的偶数 void select_test(std::set<int>& data) { set<int>::iterator iter; for (iter = data.begin(); iter != data.end(); iter++) { cout << *iter << ...

dddaron的博客 468

vector iterator not incrementable(不明显的错误)

使用vector中报出这样的错误,网上查说是迭代器删除的问题,一直没找到原因,后来终于想明白了。做个笔记,希望给遇到同样问题的读者留个参考。 1.出问题代码是这个样子的 for (auto iter = MouseListeners.v.begin(); iter != MouseListeners.v.end();++ iter) { (*iter)-...

会飞的徐公明 1789

C++: vector iterator not incrementable,迭代器失效问题

导致此问题的其中一个原因:在进行迭代器遍历容器时,原来的容器不应该再继续压入任何元素了,否则迭代器可能失效。 下面我们来以vector为例讨论一下迭代器失效背后的原理,以及什么时候会失效,什么时候正常。 先上结论:vector的迭代器失效的原因是,vector进行了改变容量大小(注意是capacity而非size)的操作,这个时候,会重新申请内存空间,并将原来的元素进行拷贝,这个时候指向原来位置的iterator仍旧指向原来的位置,而这时原来的位置的元素早已在vector扩容操作里被删除了,故此时itera

m0_48966435的博客 1592

iterator not incrementable 解决方案

今天写了这样的一段代码:for (auto it = m_vecBall.begin(); it != m_vecBall.end();) { auto x = (*it)->m_ball->getPositionX(); if (x > VISIBLESIZE.width || x < 0) { m_vecBall.e

u011488256的博客 4539

如何避免“iterator not incrementable”错误

参考

cddchina的专栏 984

迭代器iter(vetor iterator not incrementable)

今天在写MTGame中的updateEnemyAnimation时候遇到Expression : vetor iterator not incrementable,如下图:     搞了本天不明白那里出错,就大概知道迭代器不能增加。查了很多资料,发觉有以下的原因:(下列内容转载) 前段时间做图算法的project,刚刚开始使用迭代器,一些细节没有主意,编译的时候就报错“list

LRCodeant的专栏 2757

c++ list iterator not incrementable

这段代码报如下的错解决方式 for (it = li.begin(); it != li.end();it++) { li.erase(it); } for (it = li.begin(); it != li.end();) { it = li.erase(it); }

u013241840的专栏 1119

Expression:vector iterator not incrementable 从容器内部删除元素出错

今天使用容器删除元素操作时出现runtime error auto it1 = ivec.begin(); while (it1 != ivec.end()){ if (*it1 % 2 == 0) ivec.erase(it1); ++it1; } 几行代码,第一次使用容器的erase删除操作,本意是从头到尾遍历一遍容器,...

ppeng的博客 1057

[转]vector iterator not incrementable 的问题

转自:http://blog.csdn.net/kuaile123/article/details/11105115 vector::erase误使用问题:   暂时使用经验: 不能在循环中使用,否则会报如题错误。 2014/03/11更新:循环删除容器中符合条件的元素   《C++ Primer(Edit 5)》, P.349   Both forms of erase...

weixin_30706691的博客 144

STL list "list iterator not incrementable"

这几天在vc.net下写一个小东西,涉及到list的使用.程序运行到使用erase删除list中某个元素的时候,会弹出异常对话框,提示的异常为:”list iterator not incrementable”.调试检查半天无果,就特意写了一个小程序测试: #include #include #include using namespace std; int main() {

jiyanfeng1的专栏 5561

ERROR: iterator not incrementable || iterator not decrementable

ERROR: iterator not incrementable || iterator not decrementable 这个错误提示:迭代器不可以增加 exmaple: vector<int> tVecInt; vector<int>::reverse_iterator iterInt = tVec...

weixin_30730151的博客 160

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

在VS2005中使用list的erase遇到了"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); fo

zqf_office的专栏 650
keyboardFucker
博客等级 码龄10年 0粉丝 1原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值