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

C++ list 容器的用法与简化实现

list 是 STL 里的双向循环链表容器,适合频繁中间插入和删除,但不能随机访问。文章先说明了 list 的常用构造、迭代器、头尾操作和迭代器失效规则,重点强调 erase 会返回下一个有效迭代器。后半部分给出简化实现思路:把迭代器封装成节点指针包装类,主类维护头结点和大小,重点处理 insert 与 erase 的指针连接。最后和 vector 对比了底层结构、访问性能、插删效率与迭代器失效差异。

laoliangsh发布于 2026/6/300 浏览
C++ list 容器的用法与简化实现

前言

学完 vector 之后,再看 list 会很直观:它也是 STL 里的序列容器,但底层换成了双向循环链表。这个变化直接决定了它的强项和短板。中间插入、删除很顺手,随机访问就别指望了。

一、list 的介绍和使用

1.1 list 的基本概念

list 底层通常可以理解成带头结点的双向循环链表。节点不要求连续存储,所以它在频繁插入、删除时更有优势;代价是不能像 vector 那样通过下标直接定位元素。

在这里插入图片描述

1.2 常用接口

构造

list 支持默认构造、拷贝构造、区间构造,以及 C++11 的列表初始化。

list<int> l1; // 空列表
list<int> l2(4, 100); // 4 个 100
list<int> l3(l2.begin(), l2.end()); // 区间构造
list<int> l4{1, 2, 3}; // 列表初始化
迭代器

list 同样提供正向和反向迭代器。rbegin() 返回的是 reverse_iterator,它从最后一个元素开始;rend() 则对应第一个元素之前的位置。

auto it = l.begin();
while(it != l.end()){
    cout << *it << " ";
    ++it;
}
增删改查

list 支持头尾插入和删除,这一点和 deque 有点像,但它真正的价值还是体现在中间节点的插入、删除上。

L.push_back(4);
L.push_front(0);
L.pop_back();
L.pop_front();

实际写代码时,迭代器怎么走要特别小心,尤其是删除操作之后。

迭代器失效

list 的一个好处是:插入不会让已有迭代器整体失效。只有被删除的那个节点对应的迭代器才会失效。这个特性在需要边遍历边删元素时很实用。

// 错误示范
while(it != l.end()){
    l.erase(it);
    ++it; // it 已失效
}
// 正确做法
while(it != l.end()){
    it = l.erase(it); // erase 返回下一个有效迭代器
}

二、list 的模拟实现

自己实现 list,关键不是把接口堆出来,而是把节点关系和迭代器封好。双向循环链表看起来简单,真正麻烦的地方都在指针连接上,插入和删除的时候最容易出错。

迭代器封装

list 的迭代器本质上是对节点指针的包装,需要重载解引用、自增、自减这些操作符。

template<class T, class Ref, class Ptr>
struct list_iterator {
    typedef list_node<T> Node;
    Node* _node;
    // ... operator* , operator++ 等实现
};
类结构

主类里一般会放头指针 _head 和大小 _size。构造时要把哨兵节点初始化好,析构时把整条链释放干净。

template<class T>
class list {
    Node* _head;
    size_t _size;
    // ... insert, erase, push_back 等
};

这里最值得盯紧的还是 insert 和 erase。链表实现只要这两块写对了,其他接口基本就是包装。

三、list 与 vector 的对比

特性vectorlist
底层结构动态数组双向循环链表
内存布局连续离散
随机访问O(1)O(n)
中间插入删除慢 (O(n))快 (O(1))
迭代器失效扩容可能失效仅删除当前节点失效

四、总结

list 更适合那些需要频繁在中间位置插入或删除元素的场景。它牺牲了连续内存带来的访问优势,换来的是更稳定的修改性能。写业务代码时不一定常用,但搞清楚它的链表结构,选容器时会少很多误判。

目录

  1. 前言
  2. 一、list 的介绍和使用
  3. 1.1 list 的基本概念
  4. 1.2 常用接口
  5. 构造
  6. 迭代器
  7. 增删改查
  8. 迭代器失效
  9. 二、list 的模拟实现
  10. 迭代器封装
  11. 类结构
  12. 三、list 与 vector 的对比
  13. 四、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw 飞书机器人部署记录
  • StyleSelectorXL:在 SDXL 里管理 77 种绘画风格
  • Win10 里关闭 Microsoft 365 Copilot 弹窗的几种办法
  • 在 WSL2 上部署 OpenClaw 的实操记录
  • 用 OpenClaw 和飞书搭一个 7x24 服务器运维机器人
  • Windows 本地部署 OpenClaw:打通飞书与企业微信实现 AI 助理
  • Spatial Joy 2025 AR/AI 赛事参赛指南
  • Seedance 2.0 实测:AI 视频从“能看”走向“能用”
  • Vue 3 常用编程技巧整理
  • LeetCode 962 最大宽度坡的 C 语言做法
  • Python 3.11 新特性:性能、异常与类型系统的变化
  • 用 Python 把 CSV 导入 Neo4j 的实操记录
  • Windows 上安装 Docker Desktop 与配置 WSL2
  • 浏览器端播放 H.265:WebAssembly、FFmpeg 与 WebCodecs 的组合方案
  • PaddleNLP 3.0:大模型训推一体与多硬件适配实践
  • ROS 2 机器人集群分布式控制实践
  • Web25 中 php_mt_seed 的爆破思路
  • NWPU VHR-10 遥感目标检测与 YOLO 实践
  • 6 篇新论文:记忆、长上下文、医疗评测与机器人策略
  • Unreal Engine 集成 VRM4U 的实战方案

相关免费在线工具

  • 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

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online