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

C++ STL list 容器核心特性与常用接口实战指南

C++ std::list 基于双向链表实现,元素内存非连续分布,擅长高效插入删除却不支持随机访问。掌握其构造、容量查询、迭代器遍历及增删改查接口是基础,而 emplace_back、merge、unique、splice 和 sort 等高级功能则能进一步提升处理复杂逻辑的效率。理解底层结构与接口差异,有助于在实际开发中合理选型并避免常见陷阱。

赛博行者发布于 2026/3/22更新于 2026/6/1522 浏览
C++ STL list 容器核心特性与常用接口实战指南

C++ STL list 容器详解

简介

在 C++ 标准库中,std::list 是一个双向链表容器,定义在头文件 <list> 中。其元素在内存中不是连续存储的,而是通过节点之间的指针相互链接。这种结构使得它在插入和删除操作上具有独特优势,但代价是不支持随机访问。

注意:双向链表的底层通常包含一个哨兵位(头节点),它只用于占位而不存储有效数据。因此,头插操作实际是在哨兵位之后插入,头删则是移除哨兵位后的第一个节点。

核心特性

  • 双向链表结构:每个元素包含前驱和后继指针,支持双向遍历。
  • 动态内存分配:元素分散存储,无需预先分配固定大小的内存。
  • 高效的插入删除:在已知位置时,插入或删除的时间复杂度为 O(1)。
  • 不支持随机访问:访问特定元素需要从头或尾遍历,时间复杂度为 O(n)。

如需查阅详细接口文档,建议参考 cplusplus.com list 参考。

构造方式

list 对象可以在定义时进行初始化,常见的构造方式如下:

构造函数功能说明
list()默认构造,创建一个空链表(仅含哨兵位)
list(const list& lt)拷贝构造,用已存在的对象初始化
list(size_t n, const T& val)填充构造,用 n 个指定值初始化
list(InputIterator first, InputIterator last)迭代器区间构造,使用范围 [first, last) 内的元素初始化
list(std::initializer_list<T> ilist)初始化列表构造(C++11 引入)
void test_construct() {
    list<int> lt1;                      // 构造空链表
    list<int> lt2(5, 1);                // 使用 5 个 1 初始化
    list<int> ;                 
    ; 
    ;   
}
lt3
(lt2)
// 拷贝构造
list<int> lt4(lt2.begin(), lt2.end())
// 区间构造
list<int> lt5({ 1, 2, 3, 4, 5 })
// 初始化列表构造

容量操作

主要涉及获取链表大小和判断是否为空:

  • size():获取有效节点个数。
  • empty():判断链表是否为空。
void test_capacity() {
    list<int> lt({ 1, 2, 3, 4, 5 });
    cout << lt.size() << endl;
    if (lt.empty()) 
        cout << "为空" << endl;
    else 
        cout << "非空" << endl;
}

迭代器与遍历

由于 list 底层是链表,无法像 vector 那样通过下标访问,必须依赖迭代器。可以将迭代器理解为指向节点的指针。

  • begin():返回指向第一个有效节点的迭代器。
  • end():返回指向哨兵位(逻辑尾部)的迭代器。
  • rbegin() / rend():反向迭代器。

遍历方式

方法一:范围 for 循环(推荐)

void test_traverse_range() {
    list<int> lt({ 1, 2, 3, 4, 5 });
    for (auto e : lt) {
        cout << e << " ";
    }
}

方法二:传统迭代器

void test_traverse_iter() {
    list<int> lt({ 1, 2, 3, 4, 5 });
    auto it = lt.begin();
    while (it != lt.end()) {
        cout << *it << " ";
        ++it;
    }
}

增删改查

list 提供了丰富的头部和尾部操作接口,以及通用的插入删除功能。

函数功能说明
front()获取第一个节点的值
back()获取最后一个节点的值
push_front(x)在头部插入值为 x 的新节点
pop_front()删除头部节点
push_back(x)在尾部插入值为 x 的新节点
pop_back()删除尾部节点
insert(pos, x)在 pos 指向节点之前插入 x
erase(pos)删除 pos 指向的节点
clear()清空所有有效节点

高级接口说明

emplace_back vs push_back

emplace_back 允许直接在容器内部构造对象,避免了临时对象的拷贝或移动开销。特别是当我们需要直接传递构造参数时,push_back 可能无法编译,而 emplace_back 可以。

struct AA { 
    int _a1, _a2; 
    AA(int a1 = 1, int a2 = 1) :_a1(a1), _a2(a2) {} 
};

void test_emplace() {
    list<AA> lt;
    // push_back 需要对象存在
    AA a1; 
    lt.push_back(a1);
    
    // emplace_back 直接传参构造
    lt.emplace_back(30, 30); 
}

merge:合并有序链表

merge 只能用于合并两个已经排好序的链表。合并后,源链表将变为空。

void test_merge() {
    std::list<double> first, second;
    first.push_back(3.1); first.push_back(2.2); first.push_back(2.9);
    second.push_back(3.7); second.push_back(7.1); second.push_back(1.4);
    
    first.sort(); 
    second.sort(); 
    
    first.merge(second); // second 变为空
    for (auto e : first) cout << e << " ";
}

unique:移除连续重复元素

该函数仅移除连续的重复元素,并保留一个实例。如果重复元素不连续,则不会被移除。

void test_unique() {
    list<int> lt;
    lt.push_back(1); lt.push_back(5); lt.push_back(5);
    lt.push_back(4); lt.push_back(5); lt.push_back(6);
    
    lt.unique(); // 移除连续的 5
}

splice:链表间元素移动

splice 可以将一个链表中的元素或范围移动到另一个链表的指定位置。这是一个零拷贝操作,效率极高。移动后,源链表对应部分将变空。

void test_splice() {
    std::list<int> mylist1, mylist2;
    for (int i = 1; i <= 4; ++i) mylist1.push_back(i);
    for (int i = 1; i <= 3; ++i) mylist2.push_back(i * 10);
    
    auto it = mylist1.begin();
    ++it;
    mylist1.splice(it, mylist2); // 将 mylist2 全部移入 mylist1 第二个位置前
}

sort:链表排序

标准库算法 std::sort 要求随机访问迭代器,而 list 提供的是双向迭代器,因此不能直接使用 std::sort。list 类成员函数 sort() 专门针对双向链表优化了排序算法。

#include <algorithm>

void test_sort() {
    list<int> lt;
    lt.push_back(6); lt.push_back(3); lt.push_back(5);
    lt.push_back(2); lt.push_back(1);
    
    // list::sort 可用
    lt.sort(); 
    
    // std::sort 不可用,会报错
    // std::sort(lt.begin(), lt.end()); 
}

目录

  1. C++ STL list 容器详解
  2. 简介
  3. 核心特性
  4. 构造方式
  5. 容量操作
  6. 迭代器与遍历
  7. 遍历方式
  8. 增删改查
  9. 高级接口说明
  10. emplaceback vs pushback
  11. merge:合并有序链表
  12. unique:移除连续重复元素
  13. splice:链表间元素移动
  14. sort:链表排序
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • C++ STL set 系列:底层原理、核心接口与实战场景
  • 动态规划专题:子序列问题的核心思路与实战
  • 使用 Trae IDE 结合 Figma MCP 将设计稿转化为前端代码
  • C++ STL 容器详解:map 与 set 的使用与底层原理
  • 腾讯位置服务开发者征文大赛:AI+地图赛道选题与投稿指南
  • C++ STL map 容器核心概念与实战应用
  • C++ STL map 核心解析:从原理到实战应用
  • C++ STL list 容器深度剖析与模拟实现
  • C++ STL list 容器详解:使用与模拟实现
  • LLM 大模型存储记忆功能详解
  • Stable Diffusion 艺术风格参考工具:833 种风格离线使用指南
  • 基于 LSTM 与 Django 的学生学习分析与成绩预测系统
  • Go2 机器人 ROS2 与 Gazebo 仿真环境搭建实战
  • C++ STL list 容器详解:使用与模拟实现
  • GitHub 开源项目日报:2026 年 2 月 23 日 AI 工具与代理热榜
  • C++ STL list 容器详解:使用与模拟实现
  • C++ STL list 容器详解:使用与模拟实现
  • DICOM 标准详解:文件解析、Java/Python 库与 AI 应用
  • C++ STL list 容器详解:使用与模拟实现
  • C++ STL list 容器详解:使用与模拟实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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