跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 迭代器失效详解

C++ 中迭代器失效的概念及在不同容器中的表现。在 vector 容器中,插入元素若触发内存重分配会导致所有迭代器失效,删除元素会导致被删位置后的迭代器失效。list 容器因链表结构,插入不失效,仅删除指向元素本身失效。map 等关联容器插入不失效,删除仅使指向被删元素的迭代器失效。理解这些机制对避免程序崩溃至关重要。

星河入梦发布于 2026/3/24更新于 2026/9/481 浏览
C++ 迭代器失效详解

迭代器失效

在这里插入图片描述

定义

迭代器失效是指在使用迭代器遍历容器(如 vector、list、map 等)的过程中,由于容器内部结构发生了变化,导致原来的迭代器不再有效,不能正确地指向它原本所指向的元素或者不能按照预期的方式进行遍历。

Vector 容器中的迭代器失效

插入操作导致的迭代器失效

当在 vector 中插入元素时,如果插入操作导致了内存重新分配,那么所有指向该 vector 的迭代器都会失效。这是因为 vector 的存储是连续的内存空间,当插入元素使得当前容量不够时,vector 会重新分配一块更大的内存空间,将原来的元素复制或移动到新的空间中,原来的迭代器所指向的内存地址就不再有效。

示例:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3};
    auto it = v.begin();
    v.push_back(4); // 插入元素可能导致内存重新分配
    // 此时 it 可能已经失效,下面的操作可能会导致程序出错
    std::cout << *it << std::endl;
    return 0;
}

文章配图

文章配图

删除操作导致的迭代器失效

在 vector 中删除元素后,被删除元素之后的迭代器都会失效。这是因为删除元素会导致后面的元素向前移动,迭代器原本指向的元素位置发生了改变。

如:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4};
    auto it = v.begin() + 1; // 指向元素 2
    v.erase(it); // 删除元素 2
    // 此时 it 已经失效,下面的操作可能会导致程序出错
    std::cout << *it << std::endl;
    return 0;
}

List 容器中的迭代器失效

插入操作

对于 list 容器,插入操作不会导致迭代器失效。因为 list 是由节点组成的链表结构,插入新节点只是修改节点之间的链接关系,迭代器指向的节点本身并没有改变。

例如:

#include <iostream>
#include <list>

int main() {
    std::list<int> l = {1, 2, 3};
    auto it = l.begin();
    l.insert(it, 0); // 在头部插入元素 0
    std::cout << *it << std::endl; // it 仍然有效,输出 1
    return 0;
}
删除操作

在 list 中删除一个元素后,只有指向被删除元素的迭代器会失效。其他迭代器不受影响,因为链表结构的特点使得删除操作只是调整节点之间的连接,不会像 vector 那样引起其他元素的移动。

例如:

#include <iostream>
#include <list>

int main() {
    std::list<int> l = {1, 2, 3};
    auto it = l.begin();
    l.erase(it); // 删除第一个元素 1
    // it 已经失效,不能再使用
    // 可以重新获取迭代器来遍历
    for (auto new_it = l.begin(); new_it != l.end(); ++new_it) {
        std::cout << *new_it << std::endl;
    }
    return 0;
}

又如:

文章配图

关联容器中的迭代器失效

对于关联容器(以 map 为例),插入操作不会导致迭代器失效,因为插入新元素只是在红黑树(map 通常的底层实现)中添加一个节点,不会改变已有节点的地址。

删除操作会导致指向被删除元素的迭代器失效,但其他迭代器仍然有效,因为红黑树的结构调整不会影响其他节点的内存位置。

例如:

#include <iostream>
#include <map>

int main() {
    std::map<int, int> m = {{1, 10}, {2, 20}};
    auto it = m.find(1);
    m.erase(it); // 删除键为 1 的元素
    // it 已经失效,不能再使用
    for (auto new_it = m.begin(); new_it != m.end(); ++new_it) {
        std::cout << new_it->first << " " << new_it->second << std::endl;
    }
    return 0;
}

目录

  1. 迭代器失效
  2. 定义
  3. Vector 容器中的迭代器失效
  4. 插入操作导致的迭代器失效
  5. 删除操作导致的迭代器失效
  6. List 容器中的迭代器失效
  7. 插入操作
  8. 删除操作
  9. 关联容器中的迭代器失效

更多推荐文章

查看全部
  • 麦橘超然 Flux 免费离线 AI 绘画方案实战评测
  • Coze 智能体核心资源详解:插件、知识库与数据库实战
  • libwebkit2gtk-4.1-0 安装依赖处理:Ubuntu 22.04 场景解析
  • MCP Server 案例:Excel 表格一键生成可视化图表 HTML 报告
  • 多线程数据竞争解析:互斥锁与原子操作原理
  • OpenCode 开源 AI 编程助手介绍
  • Python 开发者如何利用心理洞察突破 AI 需求预测局限
  • CLion + MSYS2 MinGW64 C++ 开发环境配置指南
  • 基于 Qwen3:32B 的文旅智能导览 Agent 实践:知识问答、路线规划与 AR 联动
  • MVP 到千万级并发:AI 在前后端开发中的差异化落地指南
  • AI 中转 API 原理揭秘:为何价格远低于官方?
  • OpenCode 集成 Kimi K2.5 配置与使用指南
  • JSON 基础、数据转换与 Flask 前后端交互实战
  • 《数据结构(C 语言版)》严蔚敏 第三版 经典教材导读
  • Web 服务基石:Nginx 从安装到高级配置实战
  • Trae IDE 实战:从零开发 AI Chatbot 应用
  • DeepSeek-R1-Distill-Llama-8B 在 Ollama 中的 HTTP API 鉴权与访问控制配置
  • C++ 继承机制详解:概念、作用域与虚继承
  • Sebastian Raschka 新书发布:从零开始构建大型语言模型
  • 次模函数(Submodular Function)概念与 AI 应用

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online