当前位置: 首页 > news >正文

STL list与vector核心差异详解

一、上期回顾

掌握vector动态数组:连续内存、随机访问、自动扩容、size/capacity 区别、常用增删接口。今天学习STL list 双向循环链表,和 vector 做对标选型。


二、list 底层本质

list底层是双向循环链表

  • 每一个节点:存数据 + 前驱指针 + 后继指针
  • 内存不连续,不支持下标随机访问
  • 任意位置插入、删除O(1)效率极高

三、list 与 vector 核心差异

表格

特性vectorlist
底层结构连续动态数组双向链表
随机访问支持[]下标不支持下标
头部 / 中间插入删除O (n) 效率低O (1) 效率高
尾部增删O (1) 很快O(1)
内存占用紧凑无冗余每个节点带两个指针,开销大
迭代器可能失效插入不失效,仅删除当前迭代器失效

选型口诀

  • 频繁查询、随机访问 → 用 vector
  • 频繁中间 / 头部插入删除、不常查找 → 用 list

四、list 常用构造方式

#include <iostream> #include <list> using namespace std; int main() { // 1. 空链表 list<int> l1; // 2. 5个默认0 list<int> l2(5); // 3. 5个值为8 list<int> l3(5, 8); // 4. 拷贝构造 list<int> l4(l3); // 5. 区间构造 list<int> l5(l4.begin(), l4.end()); return 0; }

五、list 常用赋值与遍历

赋值

list<int> l1 = {1,2,3,4}; list<int> l2; l2 = l1; l2.assign(3, 66); l2.assign(l1.begin(), l1.end());

遍历方式

注意:list 不支持下标[]访问只能用迭代器、范围 for:

list<int> l = {10,20,30}; // 1. 迭代器遍历 for(list<int>::iterator it = l.begin(); it != l.end(); ++it) { cout << *it << " "; } // 2. 范围for遍历 for(auto val : l) { cout << val << " "; }

六、list 核心常用接口

list<int> l; // 尾插、头插 l.push_back(10); l.push_front(5); // 尾删、头删 l.pop_back(); l.pop_front(); // 大小、判空、清空 l.size(); l.empty(); l.clear(); // 指定位置插入 l.insert(l.begin(), 99); // 删除 l.erase(l.begin()); // 移除指定元素 l.remove(10); // 反转链表 l.reverse(); // 排序 l.sort();

重点:

  • remove(值):直接删除所有等于该值的元素,vector 没有这个便捷接口
  • sort():list 自带排序,不用算法库 sort,因为不支持随机访问迭代器

七、list 迭代器失效特性

  1. 插入元素:所有迭代器都不失效
  2. 删除元素:仅被删除节点的迭代器失效,其他仍有效对比 vector:插入删除极易导致大量迭代器失效,list 更安全。

八、完整综合示例代码

#include <iostream> #include <list> using namespace std; int main() { list<int> l; // 头尾插入 l.push_back(1); l.push_back(3); l.push_front(0); l.push_back(5); cout << "遍历元素:"; for(auto val : l) { cout << val << " "; } cout << endl; // 反转 l.reverse(); cout << "反转后:"; for(auto val : l) cout << val << " "; cout << endl; // 排序 l.sort(); cout << "排序后:"; for(auto val : l) cout << val << " "; return 0; }

运行结果:

遍历元素:0 1 3 5 反转后:5 3 1 0 排序后:0 1 3 5

九、今日核心总结

  1. list 底层双向循环链表,内存不连续
  2. 不支持下标随机访问,只能迭代器 / 范围 for 遍历
  3. 中间、头部增删效率远高于 vector
  4. 独有接口:removereverse、自带sort
  5. 迭代器不易失效,适合频繁插入删除场景
  6. 业务选型:查多用 vector,插删多用 list

十、课后练习

  1. 创建 list 存入 5 个数字
  2. 头插、尾插各加一个数
  3. 调用 reverse 反转、sort 排序并打印
http://www.jsqmd.com/news/759357/

相关文章:

  • 专业级无人机控制系统分析:PIDtoolbox黑盒日志诊断实战
  • 从一次线上故障复盘说起:我们是如何被一个‘静默’的ajax错误(status:0)坑惨的
  • 告别NeRF的慢渲染:用GS-IR实现实时场景分解与重打光(附效果对比)
  • 如何5分钟掌握FanControl:Windows风扇调速终极指南
  • 开源小说下载器:200+网站小说离线阅读的终极解决方案
  • NVIDIA Profile Inspector完全指南:解锁显卡隐藏功能,优化游戏性能
  • 使用Taotoken CLI工具一键生成多款AI工具配置提升团队效率
  • 对比直接使用厂商API体验Taotoken在路由容灾上的便利
  • SegmentTermsEnum#postings 和 IntersectTermsEnum#postings
  • 如何通过curl命令快速接入Taotoken并调用大模型API
  • 终极Windows和Office激活指南:3步实现永久免费激活的完整解决方案
  • 基于FastAPI与React构建Claude Code全栈管理工具:架构设计与核心实现
  • Excel批量导入图片避坑指南:为什么你的图片和名字总对不上?从排序到对齐的完整解决方案
  • 虚拟游戏手柄终极指南:用ViGEmBus解锁Windows游戏控制自由 [特殊字符]
  • 用AT32F437的QSPI给项目扩容:手把手实现华邦W25N01G NAND Flash的文件系统移植
  • 在MS-DOS上本地运行AI大模型:doschgpt项目技术解析与实践
  • 告别枯燥理论!手把手教你用CANoe的LIN Stress IG模块模拟真实总线错误
  • TranslucentTB:让Windows任务栏焕然一新的5个神奇效果
  • 从电路板到代码:逻辑图、波形图在FPGA/Verilog设计中的实战转换指南
  • JavaWeb开发踩坑记:阿里云OSS上传报错Access key id should not be null or empty?手把手教你配置Windows环境变量
  • Autovisor:重新定义智慧树课程自动化学习的智能助手
  • STM32电容触摸按键调试避坑指南:从原理到代码,解决灵敏度不稳和误触发问题
  • REFramework技术分析:如何解决《生化危机2重制版》非光追版启动崩溃难题
  • Unity游戏翻译终极指南:5分钟实现游戏全自动汉化
  • 深入剖析乐观锁背后的原理
  • DROID-SLAM的“可微分BA层”到底强在哪?深入拆解RAFT与LieTorch的协同设计
  • 从Kaggle竞赛到真实业务:我是如何用SHAP值说服医生信任我的‘患者再入院风险’模型的
  • 新手零门槛入门:在快马平台完成你的第一个hermes-agent安装与测试
  • STM32 PID温控终极指南:从零到精通的5个实战技巧
  • AI智能体技能开发实战:从LLM工具封装到复杂任务自动化