首页 > 后端开发 > C++ > 正文

C++ STL迭代器失效有哪些情况 总结各容器修改操作的风险点

P粉602998670
发布: 2025-07-20 10:44:01
原创
438人浏览过

c++++ stl中迭代器失效问题需根据容器类型判断。vector扩容或中间插入会导致所有迭代器失效;deque前后插入通常安全但中间插入可能失效;list和forward_list插入不影响其他迭代器,仅删除时被删节点迭代器失效;map、set等关联容器插入不影响迭代器,删除仅使对应元素迭代器失效;unordered容器rehash时可能全部失效。选对容器能有效避免此类问题。

C++ STL迭代器失效有哪些情况 总结各容器修改操作的风险点

在 C++ STL 中,迭代器失效是一个常见但容易出错的问题。容器的修改操作可能会导致原有的迭代器失效,进而引发未定义行为。常见的问题场景包括插入、删除、扩容等操作。理解不同容器在这些操作下的表现,是避免 bug 的关键。

C++ STL迭代器失效有哪些情况 总结各容器修改操作的风险点

下面按不同容器类型总结修改操作对迭代器的影响和风险点。

C++ STL迭代器失效有哪些情况 总结各容器修改操作的风险点

vector:插入和扩容易失效

vector 是一个动态数组,元素在内存中连续存放。一旦发生扩容(比如 push_back 导致容量不足),所有迭代器都会失效。即使没有扩容,插入操作也可能影响部分或全部迭代器:

立即学习C++免费学习笔记(深入)”;

  • 尾后插入(push_back / emplace_back)

    C++ STL迭代器失效有哪些情况 总结各容器修改操作的风险点
    • 如果当前容量足够,不会使已有迭代器失效;
    • 容量不够时重新分配内存,所有迭代器失效。
  • 中间插入(insert / emplace)

    • 所有指向该 vector 的迭代器都可能失效,包括指向插入位置之后的元素。
小建议:如果频繁插入且需要保持迭代器有效性,vector 不是首选容器。

deque:前后插入相对安全,中间插入代价高

deque 底层是分段连续空间,相比 vector 更灵活:

  • 前端或后端插入(push_front / push_back)

    • 迭代器通常不会失效,除非触发了新块的分配,此时与具体实现有关;
    • 但在大多数标准实现中,这种操作不会使现有迭代器失效。
  • 中间插入(insert)

    • 插入位置后的迭代器可能失效;
    • 同时,由于结构复杂,性能不如 list 或 forward_list。

注意:虽然 deque 支持随机访问,但其迭代器稳定性不如 list,使用时需谨慎。


list 和 forward_list:迭代器几乎不因插入失效

list 和 forward_list 是链表结构,节点在内存中非连续:

BibiGPT-哔哔终结者
BibiGPT-哔哔终结者

B站视频总结器-一键总结 音视频内容

BibiGPT-哔哔终结者 28
查看详情 BibiGPT-哔哔终结者
  • 插入操作(push_front / insert 等)

    • 插入不会影响其他节点的地址,因此迭代器不会失效;
    • 只有被删除节点的迭代器才会失效。
  • 删除操作(erase)

    • 被删除节点的迭代器失效;
    • 其他节点不受影响。

建议:如果你需要频繁插入/删除并保持迭代器有效性,list 是更合适的选择。


map、set、unordered_map、unordered_set:删除不影响其他迭代器

关联容器如 map、set、unordered_map、unordered_set 在插入和删除时的行为如下:

  • 插入操作(insert / emplace)

    • 不会影响已有迭代器。
  • 删除操作(erase)

    • 只会使指向被删除元素的迭代器失效;
    • 其他迭代器保持有效。

特别注意:对于 unordered 容器,在 rehash 时会重新分布桶,可能导致所有迭代器失效,但插入时不立即触发 rehash,因此一般不会突然失效。


总结一下各类操作的风险等级:

  • 高风险(慎用):

    • vector 中间插入
    • vector 扩容
    • deque 中间插入
  • 中等风险:

    • unordered 容器 rehash
  • 低风险(较安全):

    • list / forward_list 插入删除
    • map / set 插入删除
    • deque 前后插入

基本上就这些情况需要注意。不同的容器设计决定了它们在迭代器稳定性上的差异,选对容器可以大大减少这类问题的发生。

以上就是C++ STL迭代器失效有哪些情况 总结各容器修改操作的风险点的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号