C++遍历Vector的错误
来源:互联网 发布:飞耀速录软件 编辑:程序博客网 时间:2024/05/21 05:59
1.vector iterators incompatible
发现引发这个错误的代码如下:
for (VectorType::iterator it = someVector.begin();; it != someVector.end();++it;){ if (*it== value) { someVector.erase(it); }}代码中,在erase操作后,没有修改it就继续循环,在与end()比较时,断言出现。
这里的主要问题是,vector可以用任意方法实现erase,不保证在erase一个元素后,后续的元素一定被移动到这个iterator所引用的位置(地址)。当然,这在几乎所有STL的实现中,都是对的,这也就是以前用VC6编译后运行没有问题的原因。但如果这里用的不是vector,而是list或是map,运行到这里,程序会毫不犹豫的崩溃。
正确的做法是这样的:
STL里所有的容器类的erase实现都会返回一个iterator,这个iterator指向了“当前删除元素的后继元素,或是end()”
因此,在遍历容器的所有元素过程中通过erase删除一个元素后,将erase的返回值赋给迭代变量:
for (VectorType::iterator it = someVector.begin();; it != someVector.end();){ if (*it== value) { it = someVector.erase(it); } else { ++it; }}
P.S. 可以看出,VS2005带的STL增加了更多的调试特性以避免出现STL的一些错误,有条件的话最好用VS2005的STL。如果没有VS2005,也可以使用STLport,STLport在调试特性上也非常出色。
如果你要略过这个检查,可以用#define _HAS_ITERATOR_DEBUGGING 0 不过建议还是检查线程的同步代码。
2.空Vector问题。
不允许引用空vector的begin迭代器,因为vector是空的,自然不会有第一个项目,使用也会引发vector iterators incompatible。
3.vector同时读写引发。
vc2005 对于迭代器的匹配是非常严格的,通常这种错误是因为两个不同的迭代器操作同一个 vector,或者是因为迭代器在遍历vector时,vector的链表改变了,就会引发这种错误,比如vector在遍历的途中,别的位置push_back()一个元素,这时迭代器就失效了,导致错误。可以使用临界区互斥访问。
4.迭代器越界,则相应会调用一个非法参数处理程序。
再次提醒,可以通过抛出一个越界异常来避免产生非法参数问题。在代码中加入#define value of _SECURE_SCL_THROWS,并把value值设为1,这样就不会调用非法参数处理程序,而是产生一个异常了。
也可以通过设置#defined value of _SECURE_SCL值为零,关闭此迭代器检查,通常默认情况下,此选项是打开的。
5.VS2005编译Release版STL的迭代器bug。
经测试Unicode版的比较容易出这个问题,就是莫名其妙的迭代器错误。
微软的原文:The bug afflicted all Standard containers (vector, deque, list, set, multiset, map, multimap, and string) when _HAS_ITERATOR_DEBUGGING was disabled and _SECURE_SCL was enabled. Additionally, deque was afflicted when both were disabled.解决办法是
#ifndef _DEBUG
#define _SECURE_SCL 0
#endif
- C++遍历Vector的错误
- Vector的遍历
- 简单的Vector遍历
- vector容器的遍历
- 容器vector的遍历
- c++在遍历vector数组的时候,发生的传出引用的错误,特别记录一下
- Vector的初始化与遍历
- vector的初始化和遍历
- STL Vector 的遍历删除
- vector的初始化和遍历
- STL Vector 的遍历删除
- vector的初始化和遍历
- c++在vector的遍历
- vector的初始化和遍历
- 通过下标遍历std::vector,一个非常隐蔽的越界错误
- C++----Vector的使用
- C++vector的使用方法
- 【C++】vector的使用方法
- pt-online-schema-change原理及使用方法
- 做事情,态度很重要。
- 鄂尔多斯---东胜(随笔)
- 用prctl给线程命名
- [Python]网络爬虫(11):亮剑!爬虫框架小抓抓Scrapy闪亮登场!
- C++遍历Vector的错误
- 当CityEngine中遇到双显卡时,这么搞一下就行。。。。
- python 自动补全
- 安卓应用运营知识:VersionCode和VersionName(转)
- Effective C++读书笔记(11)
- D的小L 全排列 STL
- 小P寻宝记
- 常用数据挖掘算法 - 决策树ID3&关联推荐Apriori &朴素贝叶斯NBC
- 纯粹透明背景的QGraphicsView