deque 迭代器失效的问题详解

2023-05-16

    今天在看STL源码的时候,无意写了如下的代码,发现程序崩溃了:

<span style="font-size:14px;">    deque<int>::iterator iter=d.begin();
    d.insert(iter,5); 
    d.insert(iter,6); //崩溃,迭代器失效了

</span>
之前一直没有留意这个问题,后来结合源码和查找资料,得到如下的结论:

插入操作:

1、在队前或队后插入元素时(push_back(),push_front()),由于可能缓冲区的空间不够,需要增加map中控器,而中控器的个数也不够,所以新开辟更大的空间来容纳中控器,所以可能会使迭代器失效;但指针、引用仍有效,因为缓冲区已有的元素没有重新分配内存。

2、在队列其他位置插入元素时,由于会造成缓冲区的一些元素的移动(源码中执行copy()来移动数据),所以肯定会造成迭代器的失效;并且指针、引用都会失效

删除操作:

1、删除队头或队尾的元素时,由于只是对当前的元素进行操作,所以其他元素的迭代器不会受到影响,所以一定不会失效,而且指针和引用也都不会失效;

2、删除其他位置的元素时,也会造成元素的移动,所以其他元素的迭代器指针和引用都会失效。

测试代码:

deque<int>::iterator iter=d.begin();
d.push_back(10);
cout<<*iter<<endl;

在vs2012中运行时,程序立即崩溃:

而且,不管有没有出现重新分配map中控器,往deque中插入元素都会导致迭代器的失效,所以,插入一个元素后,iter迭代器已经失效了,所以再对失效的迭代器取值会导致程序崩溃,出现如上错误,不知道其他的编译器对这种情况是如何处理的。

查找资料为:

vector迭代器的几种失效的情况:
1.当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。
2.当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。
3.当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。

deque迭代器的失效情况: ,在C++Primer一书中是这样限定的,
1.在deque容器首部或者尾部插入元素不会使得任何迭代器失效。//通过vs2012测试不管前端插入还是后端插入,都会使迭代器 失效
2.在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。
3.在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。

再次测试:

deque<int>::iterator iter=d.begin();
d.pop_back();
cout<<*iter<<endl;

上面代码可以顺利通过测试,说明队尾弹出元素并不会使迭代器失效(当然删除的那个元素的迭代器肯定会失效)。
所以,为了避免程序因为迭代器的失效而程序崩溃,所以尤其在对元素进行插入和删除的操作时一定要考虑迭代器的失效问题,上面第一个测试代码的正确版如下:

int main()
{
	int i[10]={1,2,5,3,7,5,2,8,5,9};
	list<int>  l;
	deque<int,allocator<int>> d(i,i+10);
	deque<int>::iterator iter=d.begin();
	iter=d.insert(iter,5);   //插入返回一个插入点的迭代器,重新给iter迭代器赋值就没有问题了。
	iter=d.insert(iter,6);
	cout<<*iter<<endl;  //输出结果为6
}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

deque 迭代器失效的问题详解 的相关文章

  • C++ STL — 第6章 STL容器(二)deque

    C 43 43 STL容器deque和vector很类似 xff0c 也是采用动态数组来管理元素 使用deque之前需包含头文件 xff1a include lt deque gt 它是定义在命名空间std内的一个class templat
  • deque 迭代器失效的问题详解

    今天在看STL源码的时候 xff0c 无意写了如下的代码 xff0c 发现程序崩溃了 xff1a lt span style 61 34 font size 14px 34 gt deque lt int gt iterator iter
  • Python deque的用法介绍

    Python deque的用法介绍 deque 是Python标准库 collections 中的一个类 实现了两端都可以操作的队列 相当于双端队列 与Python的基本数据类型列表很相似 Python实现双端队列参考 https blog
  • 迭代 std::deque 时擦除元素时出现分段错误

    为什么下面的代码会崩溃 当我通过反向迭代器进行迭代时应该做什么 那么如何删除单个元素呢 deque q q push back 4 q push back 41 q push back 14 for auto it q begin it q
  • 分配新块时如何控制“std::deque”的块大小?

    当我们向a中插入一个新元素时std deque 如果现有的块都已满 它可能会分配一个新的块来包含该元素 然而 实现如何控制块大小呢 用户是否可以控制块大小 或者它仅取决于实现的选择 例如4K 还是 8K 这是实现的选定值 无法对其进行控制
  • 使用有限的操作对双端队列进行排序?

    您好 我在 Robert Sedgewick 的 算法第四版 中遇到了一个问题 出队排序 解释如何对一副牌进行排序 但唯一允许的操作是查看最上面两张牌的值 交换最上面两张牌以及将最上面的牌移动到这副牌的底部 我希望有人能解释一下这是如何完成
  • 为什么在一个大的 std::list 上迭代这么慢?

    正如标题所示 我的一个程序遇到了问题 我使用 std list 作为堆栈 并且还迭代列表的所有元素 当列表变得非常大时 程序花费的时间就太长了 有人对此有好的解释吗 是一些堆栈 缓存行为吗 通过将列表更改为 std vector 和 std
  • 为什么ArrayDeque比LinkedList更好

    我试图理解为什么Java的ArrayDeque比Java的LinkedList更好因为它们都实现了 Deque 接口 我几乎没有看到有人在他们的代码中使用 ArrayDeque 如果有人更深入地了解 ArrayDeque 的实现方式 那将会
  • OpenCV - 如何将 Mat 推回到队列中?

    我正在尝试将视频帧放入双端队列中 这段代码不起作用 因为队列的后部和前部都与当前帧相同 deque
  • 为什么 STL 双端队列不作为循环向量实现?

    我一直认为在C 标准模板库 STL 中 双端队列 deque 是一个具有循环边界条件的大小可变数组 如向量 意味着有一个头指针i和一个尾指针j都指向数组的某个位置a 0 L 1 一个push front是i push back 是j pop
  • 为什么我更喜欢使用向量而不是双端队列

    Since 它们都是连续的内存容器 在功能方面 双端队列几乎拥有向量所拥有的一切 但更多 因为在前面插入效率更高 为什么有人会更喜欢std vector to std deque 中的元素deque are not内存中连续的 vector
  • 为什么在 collections.deque 中间添加或删除比在那里查找慢?

    This wiki python org https wiki python org moin TimeComplexity关于某些数据结构的算法复杂性的页面说以下内容collections deque object deque 双端队列
  • 用 C++ 构建多线程工作队列(消费者/生产者)

    我有以下场景 我有一个线程应该填充 带有整数对的容器 本质上是任务描述 我有一个很大的 应从此容器中获取元素并执行操作的工作线程数 8 16 一些工作 我认为这个问题可以通过阻塞队列轻松解决 例如在项目删除时 线程同步对队列的访问 如果没有
  • 时间复杂度:删除双端队列的元素

    删除一个元素的时间复杂度是多少collections deque E g deq collections deque 1 2 3 del deq 1 Summary 时间复杂度为 O n 其中 n 是到最近端点的距离 总尺寸为deque不要
  • 如何创建一个大小有限的VecDeque?

    我想实施一个VecDeque有最大尺寸限制 我有两个策略 但我都无法完成 第一种方法 通过组合继承 我创建了一个新结构 pub struct LimVecDeque
  • 在java中实现双端队列的问题

    抱歉 接下来是我在这里提出的问题 here https stackoverflow com questions 4927026 double sided queue problem我正在尝试运行此方法以从双面队列 双端队列 中删除通用值 E
  • deque如何具有摊余常数时间复杂度

    I read here https stackoverflow com questions 22306949 does deque provide o1 complexity when inserting on top从接受的答案来看 st
  • 为什么现实世界中我们需要 Deque 数据结构? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 谁能给我举一个情况的例子Deque https en wikipedia org wiki Double ended queue需要数
  • C++联合赋值,有什么好的方法吗?

    我正在与图书馆合作开展一个项目 我必须与工会合作 具体来说 我正在与 SDL 合作 SDL 事件联合 http www libsdl org cgi docwiki cgi SDL Event 我需要复制 SDL Events 但找不到有关
  • 如何在javascript中实现deque数据结构?

    我正在用 javascript 学习数据结构 我现在的重点是如何实现双端队列 编辑 从下面的评论中我得到了有关如何实施的有用指示deque based array 有没有一个具体实施的方向deque based object使用类 我明白了

随机推荐

  • 利用字符串的最后一个字符为‘\0‘的特性操作字符串

    利用末尾为 0 特性 xff0c 求字符串长度 xff0c 实现strlen int len 61 0 char str 61 34 hello 34 char p 61 str while p len 43 43 计算字符串的长度 p 4
  • 信号量sem_init,sem_wait,sem_post

    本篇文章是信号量的简单入门 xff0c 主要学习关于信号量四个函数的使用 文章综合整理了两篇文章 xff1a http blog csdn net qyz og article details 47189219 http blog csdn
  • readdir函数

    readdir会不断读取目中的文件及目录 xff0c 但不会读子目录中的文件 include lt sys types h gt include lt dirent h gt include lt stdio h gt include lt
  • fwrite写文件是乱码

    fwrite写的二进制文件 xff0c 所以我们打开所写的文件是乱码 xff0c 但数据是正确的 xff0c 我们通过fread函数按照原来的数据格式读取即可 可以参考该文 include lt sys types h gt include
  • 经典面试题 动态链接库与静态链接库的区别

    经典面试题 动态链接库与静态链接库的区别 面试轻松学习 xff0c offer快点拿 文章目录 经典面试题 动态链接库与静态链接库的区别一 动态链接库是什么 xff1f 二 静态链接库是什么 xff1f 三 区别1 静态链接库速度快 xff
  • Docker占用的磁盘空间清理

    Docker占用的磁盘空间清理 1 docker system命令 在谁用光了磁盘 xff1f Docker System命令详解中 xff0c 我们详细介绍了docker system命令 它可以用于管理磁盘空间 docker syste
  • 卡尔曼滤波算法详细推导(全网最详细的推导过程)

    本文是来源于B站Dr CAN的视频的学习笔记 xff0c 有需要详细了解的 xff0c 可以到B站看相关视频DR CAN的个人空间 1 递归算法 例 xff1a 假设测一段距离 xff0c 第一次测 z 1 z 1 z 1 61 50 1m
  • ADC采样滤波算法利用卡尔曼滤波算法详解

    1 ADC采样模型 xff08 本文为笔者早期所写 xff0c 当时对卡尔曼滤波器理解尚未透彻 xff0c 如今回顾 xff0c 该模型还有所缺陷 xff0c 推荐读者看卡尔曼的推导过程或者B站大佬Dr CAN的空间 xff09 假设ADC
  • 微信支付趟过的坑

    这段时间在做微信支付开发 xff0c 在公司的公众号审批下来后 xff0c 我这边的测试用例也已经开发完毕 xff0c 于是拿着具体的数据来调试了 xff0c 大段大段的代码就不贴了 xff0c demo里有 xff0c 这里就说说调试过程
  • java底层原理

    Java运行三部曲 xff1a 编写 xff0c 编译 xff0c 运行 编写 xff1a 硬件编写代码 xff0c 就是我们写代码 编译 xff1a javac将文件编译成一个或多个 class文件 编译中间的过程主要是类型和格式的检查
  • 信息化时代下的我们----弄潮儿

    读完 信息化与信息管理实践之道 的部分章节想起了 第三次浪潮 中的一段话 xff0c 摘录如下 人类到现在已经经历了两次巨大的变革浪潮 这两次浪潮都淹没了早先的文明和文化 xff0c 都是以前人所不能想象的生活方式 xff0c 替代了原来的
  • ORB-SLAM稠密点云地图构建(黑白+彩色)+ pcd文件以八叉树形式表示

    pcl1 8 1 VTK 7 1 1 版本一定要对好 xff0c 如果安装了不符的版本如我之前安的pcl1 1 3和VTK8 2 一定要卸载干净不然会一直报错 xff0c 不同版本的pcl和vtk是无法共存的 xff0c 并且光把包删除是不
  • 一步步学习多线程(一) 重要概念

    几个重要的概念 1 同步 xff08 synchronous xff09 和 异步 xff08 asynchronous xff09 2 并发 xff08 Concurrency xff09 和 并行 xff08 Parallelism x
  • MAVLink功能开发,移植教程。

    MAVLink功能开发 本文由 智御电子 提供 xff0c 同时提供视频移植教程 xff0c 以便电子爱好者交流学习 1 MAVLink简介 MAVLink是一种针对微型飞行器 xff0c 推出的轻量化 xff0c 仅由头文件信息编码而成的
  • workerman问题总结大全及解决方案

    workerman无法正常访问 问题描述 xff1a 在阿里云ECS上部署了workerman的应用 xff08 ECS是专有网络 xff09 xff0c 在ECS安全组里已经允许workerman需要的全部端口 xff0c 但是外网一直不
  • Eclipse Android开发遇到:"The type org.apache.http.HttpResponse cannot be resolved."问题的解决办法

    今天在做手机卫士的项目中 xff0c 在联网下载的功能模块中遇到The type org apache http HttpResponse cannot be resolved It is indirectly referenced fro
  • UG创建图纸明细表失败的情况

    今天进行UG二次开发的时候 xff0c 由于要在图纸中自动加入零件明细表 xff0c 但是当我在图纸中插入明细表的时候UG会弹出错误对话框 xff1a 当打开UGII UPDATE ALL ID SYMBOLS WITH PLIST变量时
  • 字符串末尾自动加上'\0'的情况

    之前一直都有一个问题困扰着我 xff0c 就是我们知道C风格的字符串在用strlen求长度时只会遇到 39 0 39 结束 xff0c 如果一个字符数组全部填满了 xff0c 而在末尾没有加上 39 0 39 就会出现结果不定的现象 xff
  • c++类成员变量的初始化顺序以及特殊成员的初始化方法规则

    说到类的成员变量的初始化顺序 xff0c 对于初学者很多容易混淆其顺序 xff0c 以为简单的按初始表来初始化 xff0c 其实不然 xff0c 现在我来详细讲解下类的初始化顺序 xff1a 首先由简单开始 xff1a class peop
  • deque 迭代器失效的问题详解

    今天在看STL源码的时候 xff0c 无意写了如下的代码 xff0c 发现程序崩溃了 xff1a lt span style 61 34 font size 14px 34 gt deque lt int gt iterator iter