news 2026/5/5 20:50:26

STL list与vector核心差异详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 排序并打印
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 20:43:36

观察 Taotoken 在多模型聚合调用下的路由稳定性与响应表现

观察 Taotoken 在多模型聚合调用下的路由稳定性与响应表现 1. 测试环境与配置 本次测试基于 Taotoken 平台的标准 API 接入环境&#xff0c;使用 Python SDK 进行多模型调用。在控制台配置了三个不同供应商的模型作为备用路由选项&#xff0c;模型选择策略设置为自动模式。测…

作者头像 李华
网站建设 2026/5/5 20:39:29

ROS导航调参实战:如何让你的TurtleBot3在复杂办公室环境里不撞墙?

ROS导航调参实战&#xff1a;TurtleBot3复杂环境避障优化指南 在机器人导航领域&#xff0c;ROS的move_base功能包提供了强大的路径规划能力&#xff0c;但默认参数往往难以应对真实场景中的复杂环境。当你的TurtleBot3在办公室走廊频繁撞墙、在U型转弯处卡住、或对动态障碍反应…

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

基于FastAPI与React构建Claude Code全栈管理工具:架构设计与核心实现

1. 项目概述&#xff1a;一个为Claude Code量身打造的全栈管理界面如果你和我一样&#xff0c;日常开发重度依赖Anthropic的Claude Code&#xff0c;那你肯定也经历过在终端和编辑器之间反复横跳&#xff0c;手动编辑一堆YAML、JSON配置文件的日子。管理Agent、定义技能、配置M…

作者头像 李华
网站建设 2026/5/5 20:24:33

实战指南:如何为Umi-OCR选择最佳OCR插件配置方案

实战指南&#xff1a;如何为Umi-OCR选择最佳OCR插件配置方案 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins 在当今数字化办公环境中&#xff0c;高效的文字识别技术已成为提升工作效率的关键。Umi-OCR…

作者头像 李华