news 2026/5/26 13:02:21

序列式容器 - list

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
序列式容器 - list

一、list 的核心特性

list是一个双向链表(doubly linked list),这是它区别于vector(动态数组)的核心:

  • 底层结构:每个元素都有前驱和后继指针,元素在内存中不连续存储
  • 优势:任意位置的插入 / 删除操作效率极高(O (1)),无需移动其他元素
  • 劣势:不支持随机访问(无法用下标[]访问),只能通过迭代器遍历,访问元素效率低(O (n))
  • 额外开销:每个元素需要存储前驱 / 后继指针,内存开销比vector

二、list 的基本用法(完整代码示例)

cpp

运行

#include <iostream> #include <list> // 必须包含list头文件 #include <algorithm> // 用于sort、find等算法 using namespace std; int main() { // 1. 创建list容器 list<int> myList; // 空的int类型list list<int> list2(5, 10); // 初始化5个元素,每个值为10 list<int> list3 = {1, 3, 5, 2, 4}; // 初始化列表(C++11及以上) // 2. 插入元素(list的核心优势:任意位置高效插入) myList.push_back(10); // 尾部插入 myList.push_front(20); // 头部插入 // 在指定位置插入(需先获取迭代器) auto it = myList.begin(); // 指向第一个元素(20)的迭代器 myList.insert(++it, 30); // 在20和10之间插入30,此时list:20 → 30 → 10 // 3. 访问元素(不支持[]和at,只能用迭代器/front/back) cout << "第一个元素:" << myList.front() << endl; // 20 cout << "最后一个元素:" << myList.back() << endl; // 10 // 4. 遍历list(三种常见方式) cout << "\n方式1:迭代器遍历:"; for (list<int>::iterator it = myList.begin(); it != myList.end(); ++it) { cout << *it << " "; } cout << "\n方式2:范围for遍历:"; for (int num : myList) { cout << num << " "; } cout << "\n方式3:反向遍历:"; for (list<int>::reverse_iterator it = myList.rbegin(); it != myList.rend(); ++it) { cout << *it << " "; } // 5. 删除元素(同样支持任意位置高效删除) myList.pop_front(); // 删除头部元素(20) myList.pop_back(); // 删除尾部元素(10) cout << "\n删除头尾后:"; for (int num : myList) cout << num << " "; // 只剩30 // 6. list专属操作(区别于其他容器) list3.sort(); // 链表自带排序(vector用std::sort,list不能用) cout << "\n排序后的list3:"; for (int num : list3) cout << num << " "; // 1 2 3 4 5 list3.remove(3); // 删除所有值为3的元素 cout << "\n删除值为3后:"; for (int num : list3) cout << num << " "; // 1 2 4 5 list3.unique(); // 删除连续重复元素(需先排序才会生效) myList.clear(); // 清空容器 cout << "\n清空后是否为空:" << (myList.empty() ? "是" : "否") << endl; return 0; }

输出结果

plaintext

第一个元素:20 最后一个元素:10 方式1:迭代器遍历:20 30 10 方式2:范围for遍历:20 30 10 方式3:反向遍历:10 30 20 删除头尾后:30 排序后的list3:1 2 3 4 5 删除值为3后:1 2 4 5 清空后是否为空:是

三、list 的关键注意事项

  1. 迭代器特性
    • list 的迭代器是双向迭代器(只能 ++/--),不是随机访问迭代器,因此:
      • 不能用it + 5这种随机跳转操作,只能++it逐步移动
      • 不能直接用std::sort排序,必须用list.sort()成员函数
  2. 插入 / 删除不失效迭代器
    • 对 list 插入 / 删除元素时,除了指向被删除元素的迭代器,其他迭代器都不会失效(vector 插入可能导致迭代器全部失效)
  3. 常用成员函数
    函数作用
    sort()对链表元素升序排序
    remove(val)删除所有值为 val 的元素
    unique()删除连续重复的元素
    reverse()反转链表元素顺序
    splice()拼接两个 list(高效移动)

四、list vs vector 选型对比

场景选 vector选 list
随机访问(按下标取值)
尾部增删元素
中间 / 头部频繁增删元素
内存连续性(需兼容 C 数组)
内存开销(少指针)

总结

  1. list是双向链表结构,核心优势是任意位置的插入 / 删除操作效率极高,核心劣势是不支持随机访问
  2. list有专属的操作函数(如sort()remove()),不能直接使用std::sort等依赖随机访问迭代器的算法。
  3. 选型时,若业务场景以 “中间 / 头部频繁增删” 为主,选list;若以 “随机访问、尾部增删” 为主,选vector
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/20 21:52:40

内网横向渗透:攻击者的内网扩张术与企业全维度防御实战指南

在网络攻击攻防对抗日趋激烈的当下&#xff0c;企业外网边界防御体系&#xff08;如防火墙、WAF、蜜罐&#xff09;的不断完善&#xff0c;让攻击者突破外网的难度大幅提升。但一旦攻击者通过钓鱼邮件、漏洞利用、远程办公入口等方式实现初始访问&#xff0c;后续的内网横向渗透…

作者头像 李华
网站建设 2026/5/22 7:11:49

计算机毕设java的停车场管理系统 基于Java技术的智能停车场管理系统开发 Java驱动的停车场综合管理平台设计与实现

计算机毕设java的停车场管理系统0k5o89 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着城市化进程的加速&#xff0c;车辆数量不断增加&#xff0c;停车场管理成为城市交通管…

作者头像 李华
网站建设 2026/5/20 22:11:55

揭秘ES的BKD树索引:多维数据查询的加速引擎

在Elasticsearch的索引体系中&#xff0c;倒排索引&#xff08;Inverted Index&#xff09;是全文检索的基石&#xff0c;但面对数值范围查询、地理空间搜索等场景时&#xff0c;其性能短板逐渐显现。例如&#xff0c;当用户需要查询"价格在1000-5000元之间的商品"或…

作者头像 李华
网站建设 2026/5/24 0:47:02

用Qwen3-1.7B做AI助手,效果惊艳且成本极低

用Qwen3-1.7B做AI助手&#xff0c;效果惊艳且成本极低 1. 为什么你需要一个“能思考”的轻量级AI助手&#xff1f; 你有没有遇到过这些情况&#xff1a; 想在公司内部搭个智能客服&#xff0c;但发现主流大模型动不动就要24GB显存&#xff0c;连RTX 4090都跑得吃力&#xff…

作者头像 李华
网站建设 2026/5/20 16:30:31

开发技能学习打卡工具,设定技能学习时长,(如每天学一小时python),记录学习内容,时长,生成学习时长趋势图,连续打卡奖励标记。

技能学习打卡工具 - 全栈开发实践1. 实际应用场景描述本工具面向程序员、设计师、产品经理、学生等技能学习者&#xff0c;提供游戏化的学习打卡体验。在知识爆炸的时代&#xff0c;终身学习已成为必然&#xff0c;但坚持学习却是最难的挑战。典型使用场景&#xff1a;- 程序员…

作者头像 李华
网站建设 2026/5/20 15:40:31

用Paraformer做语音转写,长音频自动切分加标点超方便

用Paraformer做语音转写&#xff0c;长音频自动切分加标点超方便 关键词&#xff1a;Paraformer、语音识别、ASR、长音频处理、Gradio、离线语音转文字、标点预测、VAD端点检测 摘要&#xff1a;本文手把手带你用Paraformer-large离线语音识别镜像完成高质量中文语音转写。无需…

作者头像 李华