(转http://hi.baidu.com/adoblog/blog/item/102574233779ba4a925807c0.html):Vector发现的一个使用细节:vector it...
2017-06-24 00:00
267 查看
以前使用VC6开发,最近换用VS2005编译以前的程序,在运行时出现断言,切回 调试器,发现提示是
"vector iterators incompatible”
发现引发这个错误的代码如下:
VectorType::iterator it = someVector.begin();
for (; it != someVector.end();)
{
if (*it== value)
{
someVector.erase(it);
}
else
{
++it;
}
}
代码中,在erase操作后,没有修改it就继续循环,在与end()比较时,断言出现。
这里的主要问题是,vector可以用任意方法实现erase,不保证在erase一个元素后,后续的元素一定被移动到这个iterator所引用的位置 (地址)。当然,这在几乎所有STL的实现中,都是对的,这也就是以前用VC6编译后运行没有问题的原因。但如果这里用的不是vector,而是list 或是map,运行到这里,程序会毫不犹豫的崩溃。
正确的做法是这样的:
STL里所有的容器类的erase实现都会返回一个iterator,这个iterator指向了“当前删除元素的后继元素,或是end()”
因此,在遍历容器的所有元素过程中通过erase删除一个元素后,将erase的返回值赋给迭代变量:
VectorType::iterator it = someVector.begin();
for (; it != someVector.end();)
{
if (*it== value)
{
it = someVector.erase(it);
}
else
{
++it;
}
}
P.S. 可以看出,VS2005带的STL增加了更多的调试特性以避免出现STL的一些错误,有条件的话最好用VS2005的STL。如果没有VS2005,也可以使用STLport,STLport在调试特性上也非常出色。
今天程序老崩溃,一开始以为是结构体数据元素过多,原来是STL的差异性引起的,记住这次的教训.
"vector iterators incompatible”
发现引发这个错误的代码如下:
VectorType::iterator it = someVector.begin();
for (; it != someVector.end();)
{
if (*it== value)
{
someVector.erase(it);
}
else
{
++it;
}
}
代码中,在erase操作后,没有修改it就继续循环,在与end()比较时,断言出现。
这里的主要问题是,vector可以用任意方法实现erase,不保证在erase一个元素后,后续的元素一定被移动到这个iterator所引用的位置 (地址)。当然,这在几乎所有STL的实现中,都是对的,这也就是以前用VC6编译后运行没有问题的原因。但如果这里用的不是vector,而是list 或是map,运行到这里,程序会毫不犹豫的崩溃。
正确的做法是这样的:
STL里所有的容器类的erase实现都会返回一个iterator,这个iterator指向了“当前删除元素的后继元素,或是end()”
因此,在遍历容器的所有元素过程中通过erase删除一个元素后,将erase的返回值赋给迭代变量:
VectorType::iterator it = someVector.begin();
for (; it != someVector.end();)
{
if (*it== value)
{
it = someVector.erase(it);
}
else
{
++it;
}
}
P.S. 可以看出,VS2005带的STL增加了更多的调试特性以避免出现STL的一些错误,有条件的话最好用VS2005的STL。如果没有VS2005,也可以使用STLport,STLport在调试特性上也非常出色。
今天程序老崩溃,一开始以为是结构体数据元素过多,原来是STL的差异性引起的,记住这次的教训.
相关文章推荐
- (转http://hi.baidu.com/adoblog/blog/item/102574233779ba4a925807c0.html):Vector发现的一个使用细节:vector iterators incompatible
- Vector发现的一个使用细节:vector iterators incompatible(转)
- SQL Server使用Bulk Insert把一个文本导入到数据库--http://www.wangchao.net.cn/it/detail_59013.html
- Linux 内核使用的 GNU C 扩展 (转自: http://hi.baidu.com/shlongli/blog/item/22120f38c8bfe820b8998fca.html)
- net use的使用(转:http://hi.baidu.com/yangbu/blog/item/80fbcb001ac75116728b65f1.html)
- 新手上道,教你如何使用http://jingyan.baidu.com/article/cdddd41c5cf93353ca00e16d.htm创建一个html+php+js+mysql
- Delphi中Format的字符串格式化使用说明(转载 http://hi.baidu.com/test__123/blog/item/e3bba1599d717a2d2834f092.html)
- “操作必须使用一个可更新的查询”的解决办法(转自:http://jingyan.baidu.com/article/d5a880eb46345613f147cc16.html)
- 各种工具使用手册:http://www.itshouce.com.cn/linux/linux-tcpdump.html 关于tcpdump!!!!
- C# 使用 GetOleDbSchemaTable 检索架构信息(表、列、主键等)--链接http://hi.baidu.com/useforprograms/blog/item/b2627decd024074778f05587.html
- 人体24小时使用手册(转自:http://hi.baidu.com/zhaolianyuok/blog/item/08e79d126c086c1b34fa4169.html)
- Delphi 中Format的字符串格式化使用说明(转载http://hi.baidu.com/test__123/blog/item/e3bba1599d717a2d2834f092.html)
- mvc bundle的介绍及使用 转载自 http://www.ityouzi.com/archives/mvc-bundleconfig.html
- Window 消息大全使用详解http://www.itepub.net/html/kaifajingcui/C___VC/2006/0515/38024.html
- Asp.net 2.0中使用ValidationGroup属性有选择验证某些控件(http://hi.baidu.com/tracyjay/blog/item/4e894e205fa18a4593580785.html)
- Native SQL查询 (使用SQLQuery) (转http://hi.baidu.com/ufeiying/blog/item/420367237fc9dd5a9822ed8a.html)
- oschina.net 是目前中国最大的开源技术社区。我们传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技
- HTML DOM insertBefore() 方法 使用的时候发现一个问题,记录下
- 使用virt-manager建立一个KVM虚拟机(转自http://virtual.it168.com/a2011/0318/1167/000001167712_2.shtml)
- 使用OpenGL开发一个指南针 (http://www.hiapk.com/thread-513153-1-1.html)