当前位置: 首页 > news >正文

迭代器失效问题(C++)

迭代器失效就是迭代器指向的位置已经不是原来的含义了,或者是指向的位置是非法的。以下是失效的几种情况:

删除元素:

此处发生了迭代器的失效,因为erase返回的是下一个元素的位置的迭代器,所以在删除1这个元素的时候,迭代器已经指向了下一个元素。而for循环体内还有一次it++,所以此时it的位置在3。不是预期的2,所以2被忽略了,后面的4同理。可以这样修改:

像list/map这样的非连续内存的容器,它们不像vector那样删除元素后会移动元素。所以这样写会导致迭代器失效:

 这样修改:

或者: 

 插入元素:

当元素个数大于vector容器总容量时,会发生扩容,而扩容一般都是进行的深拷贝,即在另一块内存开辟空间并依次赋值。所以之前那个空间的迭代器就失效了,可以这样修改: 

把迭代器重新赋值即可。 

排序:

排序也会导致迭代器失效,虽然不会报错但是输出结果也与我们预想的不同。 可以这样修改:

ps:

std::unordered_map::rehash()也会导致迭代器失效。因为unordered_map 的 rehash 函数可以用来手动调整哈希表的桶大小。 在 rehash 函数被调用时,unordered_map 会生成一个比原来桶数量更大的素数,然后将哈希表重新映射到新的桶中。

http://www.lryc.cn/news/313033.html

相关文章:

  • 2-web端管理界面使用rabbitmq
  • 【华为OD机试】最多购买宝石数目【C卷|100分】
  • RK3588 Android 12 源码编译与开发板烧录
  • 学习JAVA的第十四天(基础)
  • 安捷伦N5182A信号源 AgilentN5182A
  • 就业班 2401--3.7 Linux Day13--日志轮转+jumpserver堡垒机
  • 信息安全概论 习题
  • 仓储管理系统(WMS) 的研发历程-PRD撰写
  • springboot实现多线程开发(使用@Async注解,简单易上手)
  • 并发支持库(1)-线程
  • 2024年最新阿里云服务器地域选择方法,以及可用区说明
  • Frida实战:Java、Native、SO层面的Hook与主动调用详解
  • Codeforces Round 883 (Div. 3)(集训队加训1)
  • 自封装 bind 方法(二)
  • vcomp140.dll丢失如何修复,5种修复方法轻松搞定vcomp140.dll问题
  • 计算机视觉(Computer Vision)和机器视觉(Machine Vision)
  • 国内用ChatGPT可以吗
  • 数据分析-Pandas两种分组箱线图比较
  • Mac版2024 CleanMyMac X 4.14.6 核心功能详解以及永久下载和激活入口
  • Java引用传递及基本应用
  • 低代码测试自动化
  • Linux 文件操作命令
  • 机器学习-面经(part8、贝叶斯和其他知识点)
  • 图数据库 之 Neo4j - 应用场景3 - 知识图谱(8)
  • redis 性能优化三
  • Python用Tkinter实现圆的半径 面积 周长 知一求二程序
  • 电源环路补偿的目标是避免产生正反馈
  • SSM+MySQL替换探索 openGauss对比postgresql12
  • XGboost的整理
  • java入门基础学习导览