C++vector迭代器失效的问题
转载:http://blog.csdn.net/olanmomo/article/details/38420907
转载:http://blog.csdn.net/stpeace/article/details/46507451
转载:http://www.cnblogs.com/xkfz007/articles/2509433.html
转载:http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/13/2636375.html
有这样一个应用场景,用vector容器存储数据,一边遍历一边删除数据,同时在遍历删除的过程中又进行push_back()操作,因为用的是迭代器进行遍历,程序运行过程中出现这个错误
此错误说明访问了失效的vector迭代器。
经查询发现:vector在遍历的途中,别的位置push_back()一个元素,这时迭代器就失效了,才导致错误出现。
注:所以在使用vector遍历删除过程中不能再其他地方进行push_back()操作。
正确的做法是这样的:
STL里所有的容器类的erase实现都会返回一个iterator,这个iterator指向了“当前删除元素的后继元素,或是end()”
因此,在遍历容器的所有元素过程中通过erase删除一个元素后,将erase的返回值赋给迭代变量:
1 for (VectorType::iterator it = someVector.begin(); it != someVector.end();) 2 { 3 if (*it== value) 4 { 5 it = someVector.erase(it); 6 } 7 else 8 { 9 ++it; 10 } 11 }
补充:map为何每次insert之后,以前保存的iterator不会失效?
iterator这里就相当于指向节点的指针,内存没有变,指向内存的指针怎么会失效呢(当然被删除的那个元素本身已经失效了)。相对于vector来说,每一次删除和插入,指针都有可能失效,调用push_back在尾部插入也是如此。因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入过程中可能已经被其他内存覆盖或者内存已经被释放了。即使时push_back的时候,容器内部空间可能不够,需要一块新的更大的内存,只有把以前的内存释放,申请新的更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后,那么以前的内存指针自然就不可用了。特别时在和find等算法在一起使用的时候,牢记这个原则:不要使用过期的iterator。
C++vector迭代器失效的问题相关推荐
- STL中容器vector迭代器失效的相关问题
迭代器失效,有两个层面的意思: 无法通过迭代器++,–操作遍历整个stl容器.记作: 第一层失效. 无法通过迭代器存取迭代器所指向的内存. 记作: 第二层失效. vector是个连续内存存储的容器,如 ...
- C++知识点18——使用C++标准库(vector的增长与迭代器失效)
描述vector容器对象大小的方法有以下几个 1.size():返回vector容器对象中实际的元素个数 2.empty():当size()返回0时,该函数返回true,否则返回false,判断容器对 ...
- map和vector的迭代器失效问题(某公司招聘笔试试题)
当删除一个STL容器(比如map, vector)中的某个元素时, 会引起迭代器失效, 所以, 我们务必提高警惕. 某次笔试, 我遇到这样一个题目: 删除map<int, int>中val ...
- C++知识点20——使用C++标准库(再谈string——string的大小、容量、交换与迭代器失效)
1.string的大小与容量 size_t size() const; bool empty() const; void resize (size_t n); void resize (size_t ...
- C++迭代器失效的几种情况总结
一.序列式容器(数组式容器) 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效.这是因为vetor,deque ...
- C++(STL):09---vector迭代器失效问题
在vector中,我们经常会使用迭代器iterator对vector中的元素进行索引,也经常需要将迭代器作为参数传递到vector的成员函数中,迭代器使用非常方便,但使用不当也会给我们带来巨大的麻烦, ...
- 关于vector的迭代器失效的问题
使用vector需谨慎!尤其是还没有清楚vector的实现原理的时候! 头文件<vector>中对于失效的检测方式,定义是这样的: 当erase了vector中的一个元素后,不能保证原先指 ...
- 【C++】vector的模拟实现@STL —— 迭代器失效问题
vector的模拟实现@STL 1. (constructor) & (destructor) 2. 一系列基本接口 2.1 size & capacity 2.2 [] 2.3 it ...
- C++知识点30——使用C++标准库(关联容器map及其初始化,赋值,查找,添加,删除与迭代器失效)
一.关联容器简介 关于顺序容器和关联容器的区别已经在博客https://blog.csdn.net/Master_Cui/article/details/107427911中提过 C++标准库中的关联 ...
最新文章
- python3的各个版本有什么区别_python不同版本的_new_不同点总结
- .NET Core使用swagger进行API接口文档管理
- opencv 多线程加速_线程池给你写好了,想加速拿来用就行哈
- 在单文档中显示我的第一个对话框
- java rpc与webservice_RPC体系,RPC和WebService的区别详解
- ApacheCN 人工智能知识树 v1.0
- NodeJs学习笔记002--npm常用命令详解
- drf版本控制 和django缓存,跨域问题,
- kubeflow kfserving 详解
- KVM图形管理界面打不开(virt-manager 报错)
- Leetcode200岛屿数量(深搜)
- cls image.php,Ecshop安装过程中的的相关问题:cls_image::gd_version()和不支持JPEG_PHP教程...
- xshell 官网下载
- 回文数111111111
- 数字排列问题(全排例)
- power bi条件格式_Power BI中的条件格式
- 自然语言处理--keras实现一维卷积网络对IMDB 电影评论数据集构建情感分类器
- 制造行业实施作业成本法案例(AMT 邓为民)
- EPICS设备支持的简单示例
- Winter(Sleep)Camp2016酱油鸡