关于vector的erase操作后,迭代器失效问题
2010-11-12 01:01
357 查看
最近在写一个作业题,其中用到了vector的erase操作,不常用,不记得具体怎么回事了,偷个懒,网上搜了一下,直接照抄了,代码如下
但奇怪的是,运行的时候,每次到这段代码里面,都会直接弹出错误框,看样子是迭代器失效了,指到了不该指的地方
反复看代码,觉得vector为空的时候不可能调用,也不可能指向超过末尾的地方,郁闷半天。。。。只好广泛查阅。。。。
终于。。。找到了原因所在,哎,偷懒的代价啊偷懒的代价啊。。。。
错在不了解erase,网上那哥们儿估计也不了解。。。给出的代码还被人评为最佳答案。。。误人不浅
正确写法应该如下
原因是因为在erase操作后,原迭代器是相当于一个野指针的状态,对其++必定出错。
erase的返回值就是指向被删除的元素的下一个元素的迭代器,嚯嚯
还有分析称,其实非野,也会出BUG,vector在erase之后,长度会自动缩减,再++的话,会跳过一个元素,BUG,呵呵
vector<mission>::iterator itr = vm.begin(); while (itr != vm.end()) { if ((*itr).getStartTime() <= nowTime) { vm.erase(itr); } itr++; }
但奇怪的是,运行的时候,每次到这段代码里面,都会直接弹出错误框,看样子是迭代器失效了,指到了不该指的地方
反复看代码,觉得vector为空的时候不可能调用,也不可能指向超过末尾的地方,郁闷半天。。。。只好广泛查阅。。。。
终于。。。找到了原因所在,哎,偷懒的代价啊偷懒的代价啊。。。。
错在不了解erase,网上那哥们儿估计也不了解。。。给出的代码还被人评为最佳答案。。。误人不浅
正确写法应该如下
vector<mission>::iterator itr = vm.begin(); while (itr != vm.end()) { if ((*itr).getStartTime() <= nowTime) { itr = vm.erase(itr); } else { itr++; } }
原因是因为在erase操作后,原迭代器是相当于一个野指针的状态,对其++必定出错。
erase的返回值就是指向被删除的元素的下一个元素的迭代器,嚯嚯
还有分析称,其实非野,也会出BUG,vector在erase之后,长度会自动缩减,再++的话,会跳过一个元素,BUG,呵呵
相关文章推荐
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- 容器insert、erase操作引起迭代器失效问题
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- 关于STL的erase()陷阱-迭代器失效问题的总结
- C++关于迭代器删除(erase)插入(insert)失效问题http://m.blog.csdn.net/blog/a327369238/26715187
- C++关于迭代器删除(erase)插入(insert)失效问题
- STL中的erase操作导致指针失效问题
- C++中防止STL中迭代器失效__map/set等关联容器vector/list/deque等序列容器_如何防止迭代器失效_即erase()的使用
- STL中vector的删除操作引起迭代器失效和空间重新配置
- 关于vector::erase的问题
- 聊聊map和vector的迭代器失效问题(某公司招聘笔试试题)
- 迭代器失效问题——小心使用erase()
- 关于list容器与vector容器中的erase操作
- 关于STL erase的iterator失效问题
- 有关于STL中的迭代器失效问题[转自CSDN BLOG]
- vector和map的迭代器失效问题
- map等关联容器 vector等序列容器 如何防止迭代器失效 即erase()的使用
- 关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论
- map等关联容器 vector等序列容器 如何防止迭代器失效 即erase()的使用
- 容器大小的改变以及容器操作可能使迭代器失效、vector对象的容量变化