C++ vector 之 erase 多个元素的两种常用方法
来源:互联网 发布:湖南软件检测 编辑:程序博客网 时间:2024/05/22 05:08
这是一个古老的话题,今天拿来再炒一下,原因是我又用错了。
查阅各种 comments 以及根据我自己的使用经验,当在 vector 中 查找并 删除 其中多个元素时,我发现主要有两种方法:
// ------ Sample 1:
for ( vector<int>::iterator it = m_vecIDSet.begin(); it != m_vecIDSet.end(); ) { vector<int>::iterator it_tmep = it; ++it; int nID_in_set = *it_tmep; if ( nID_in_set == nID_to_find ) { m_vecIDSet.erase( it_tmep ); } }
// ------ Sample 2:
for ( vector<int>::iterator it = m_vecIDSet.begin(); it != m_vecIDSet.end(); ) { int nID_in_set = *it; if ( nID_in_set == nID_to_find ) it = m_vecIDSet.erase( it ); else ++it; }
两种方法看似都很好,但是经过我的实验,我发现:采用前者方法时,如果vector里存储 new出来的对象的指针,在连续查找并删除时,有时会出现 iterator 的失效问题;相同情况下,换用后者方法,工作的很好。稍微想了下原因,可能是由于erase之后,iterator不会自动指到下一个元素。如果用后者方法,直接把erase返回的iterator立即赋值给当前的 it,这样就不会出错了。可是前者方法只是对临时的 iterator it_temp 进行操作的,而且控制了 it 的前进,为何也会出错? 由于时间紧急,此处先mark,等忙完再仔细研究这个问题。
哪位大侠,若是看到了我的疑问,恳请不吝赐教!
后来,经过业内专家人士佳哥的确认后,我就有了答案:
- Re: DavyHwang 2013-04-01 13:47发表 [回复]
- 回复AlbertLi:哈哈 得到佳哥的确认后,我就放心了 :-D
Davy_H
13-03-12
- C++ vector 之 erase 多个元素的两种常用方法
- C++ vector 之 erase 多个元素的常用方法
- 删除vector容器中的对象元素的三种方法:pop_back, erase与remove算法
- 删除vector容器中的对象元素的三种方法:pop_back, erase与remove算法
- vector中清除某个元素方法(erase)
- vector删除元素之pop_back(),erase(),remove()
- Map erase的两种方法
- vector 访问元素的两种方法比较
- 关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论
- 对于vector第一个元素访问的几种方法
- 关于vector的erase方法的易错点!!!
- C++中vector::erase方法的使用
- STL vector的erase方法使用
- c++之map与vector的erase
- 使用 vector erase 指定元素
- c++ vector erase删除元素
- vector之erase
- vector之erase()
- 整理《Mastering OpenCV with Practical Computer Vision Projects》中第5章用SVM和神经网络进行车牌识别操作流程
- error C3872: “0x3000”: 此字符不允许在标识符中使用
- difference between static nested class and inner class
- yii快速入门教程17
- C#(WinForm)ComboBox和ListBox添加项及设置默认选择项
- C++ vector 之 erase 多个元素的两种常用方法
- eclipse + cocos2d-x 创建android工程(c++开发环境)
- Mac系统下MonoDevelop界面乱码及不能显示中文
- 多态小例子
- Application context和Activity context的区别
- About Android OTA system update
- Linux下产生随机密码10方法
- 50个java编程程序之四
- 项目经理必备技能-数据库设计(好帖目录,持续更新)