登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
安全
›
打破迷思:为什么资深C++开发者几乎总是选择vector而非l ...
打破迷思:为什么资深C++开发者几乎总是选择vector而非list
[ 复制链接 ]
后沛若
2025-6-1 21:07:14
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
大家好,我是小康。
前言:打破你对容器选择的固有认知
嘿,C++小伙伴们!面对这段代码,你会怎么选?
// 存储用户信息,需要频繁查找、偶尔在中间插入删除
// 选择哪个容器实现?
std::vector<UserInfo> users; // 还是
std::list<UserInfo> users; // ?
复制代码
如果你刚学习C++,可能会想:"数据会变动,肯定用list啊!教材上说链表插入删除快嘛!"
然后有一天,你看到一位经验丰富的同事把所有list都改成了vector,并且代码性能提升了,你一脸懵逼: "这跟我学的不一样啊!"
是的,传统教科书告诉我们
:
数组(vector):随机访问快,插入删除慢
链表(list):插入删除快,随机访问慢
但实际工作中,大多数资深C++开发者却几乎总是使用vector。为什么会这样?是教材错了,还是大佬们有什么不可告人的秘密?
今天,我要带你进入真实的C++江湖,揭开vector和list性能的真相,帮你彻底搞懂这个看似简单却被无数程序员误解的选择题。
深入阅读后,你会发现:这个选择背后,涉及现代计算机体系结构、内存模型和真实世界的性能考量,而不仅仅是算法复杂度的简单对比。
微信搜索 【
跟着小康学编程
】,关注我,定期分享计算机编程硬核技术文章。
一、理论上:vector和list各是什么?
先来个直观的比喻
:
vector就像一排连续的座位
:大家坐在一起,找人超快,但中间插入一个人就需要后面的人都往后挪。
list就像一群手拉手的人
:每个人只知道自己左右邻居是谁,找到第n个人必须从头数,但中间插入一个人只需要改变两边人的"指向"。
技术上讲
:
vector
:连续内存,支持随机访问(可以直接访问任意位置),内存布局紧凑
list
:双向链表,只支持顺序访问(必须从头/尾遍历),内存布局分散
vector和list的内部结构对比
vector的内部结构
:
[元素0][元素1][元素2][元素3][元素4][...]
↑ ↑
begin() end()
复制代码
vector内部其实就是一个动态扩展的数组,它有三个重要指针:
指向数组开始位置的指针start
指向最后一个元素后面位置的指针end
指向已分配内存末尾的指针(容量capacity)
当空间不够时,vector会重新分配一块更大的内存(通常是当前大小的1.5或2倍),然后把所有元素搬过去,就像搬家一样。
list的内部结构
:
┌──────┐ ┌──────┐ ┌──────┐
│ prev │◄───┤ prev │◄───┤ prev │
┌──┤ data │ │ data │ │ data │
│ │ next │───►│ next │───►│ next │
│ └──────┘ └──────┘ └──────┘
│ 节点0 节点1 节点2
↓
nullptr
复制代码
list是由一个个独立的节点组成,每个节点包含三部分:
存储的数据
指向前一个节点的指针
指向后一个节点的指针
这就像一个手拉手的圆圈游戏,每个人只能看到左右两个人,要找到第五个人,必须从第一个开始数。
这两种容器结构上的差异,决定了它们在不同操作上的性能表现。vector因为内存连续,所以可以通过简单的指针算术直接跳到任意位置;而list必须一个节点一个节点地遍历才能到达指定位置。
按照传统教科书,它们的复杂度对比是这样的
:
操作vectorlist随机访问O(1)O(n)头部插入/删除O(n)O(1)尾部插入/删除均摊 O(1)O(1)中间插入/删除O(n)O(1)**
注意
:list 的中间插入/删除是O(1),但前提是你已经有了指向该位置的迭代器,找到这个位置通常需要O(n)时间。
看上去 list 在插入删除方面优势明显,但为什么那么多经验丰富的程序员却建议"几乎总是用vector"呢?
二、现实很残酷:理论≠实践
老铁,上面的理论分析忽略了一个超级重要的现代计算机特性:
缓存友好性
。
什么是缓存友好性?
想象你去图书馆看书:
vector就像是把一整本书借出来放在你桌上(数据连续存储)
list就像是每看一页就得去书架上找下一页(数据分散存储)
现代CPU都有缓存机制,当访问一块内存时,会把周围的数据也一并加载到缓存。对于连续存储的vector,这意味着一次加载多个元素;而对于分散存储的list,每次可能只能有效加载一个节点。
实际性能测试
我做了一个简单测试,分别用vector和list存储100万个整数,然后遍历求和:
// Vector遍历测试 - 使用微秒计时更精确
auto start = chrono::high_resolution_clock::now();
int sum_vec = 0;
for (auto& num : vec) {
sum_vec += num;
}
auto end = chrono::high_resolution_clock::now();
auto vector_time = chrono::duration_cast<chrono::microseconds>(end - start).count();
// List遍历测试 - 使用微秒计时更精确
start = chrono::high_resolution_clock::now();
int sum_list = 0;
for (auto& num : lst) {
sum_list += num;
}
end = chrono::high_resolution_clock::now();
auto list_time = chrono::duration_cast<chrono::microseconds>(end - start).count();
// 输出结果 - 微秒显示,并转换为毫秒显示
....
复制代码
结果震惊了我
:
这是30几倍的差距!为啥?就是因为缓存友好性!
三、list的"快速插入"真的快吗?
我们再来测试一下在容器中间位置插入元素的性能:
[code] cout
打破
迷思
为什么
资深
开发者
相关帖子
考陪诊师为什么选北京守嘉陪诊报名?
考陪诊师为什么选北京守嘉陪诊报名?
考陪诊师为什么选北京守嘉陪诊报名?
为什么关注 CE 认证 + 特变电工供应商?
我们提供了这些企业和开发者所需的热门技术栈教程
数据库开发者必装!立即免费下载!
国内开发者合规订阅 Claude Code 的 3 条最优路径是什么?
为什么 Iceberg 在数据湖领域这么火
你的代码正在腐烂:为什么我们都不敢碰那座“屎山”?
为什么协程能让程序不再卡顿?——从同步、异步到 C++ 实战
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
考陪诊师为什么选北京守嘉陪诊报名?
1
163
唐茗
2025-12-12
安全
考陪诊师为什么选北京守嘉陪诊报名?
1
931
陶田田
2025-12-12
安全
考陪诊师为什么选北京守嘉陪诊报名?
1
678
滕佩杉
2025-12-12
安全
为什么关注 CE 认证 + 特变电工供应商?
1
755
康器
2025-12-12
安全
我们提供了这些企业和开发者所需的热门技术栈教程
0
114
佴莘莘
2025-12-13
安全
数据库开发者必装!立即免费下载!
0
425
存叭
2025-12-15
安全
国内开发者合规订阅 Claude Code 的 3 条最优路径是什么?
0
86
韶又彤
2025-12-16
业界
为什么 Iceberg 在数据湖领域这么火
0
250
季卓然
2025-12-16
业界
你的代码正在腐烂:为什么我们都不敢碰那座“屎山”?
0
614
蟠鲤
2025-12-18
业界
为什么协程能让程序不再卡顿?——从同步、异步到 C++ 实战
0
568
孟清妍
2025-12-19
回复
(8)
彭水晶
2025-10-29 13:20:26
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
热心回复!
饮邺谲
2025-10-29 20:34:32
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,下载保存了,貌似很强大
均浇
2025-11-20 08:24:01
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
谢谢分享,辛苦了
颜才
2025-11-24 03:12:43
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
新版吗?好像是停更了吧。
赖琳芳
2025-11-26 17:32:09
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢分享,下载保存了,貌似很强大
遇玷
2025-11-27 04:51:49
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
热心回复!
骂治并
3 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
前排留名,哈哈哈
旁拮猾
8 小时前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢发布原创作品,程序园因你更精彩
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
后沛若
8 小时前
关注
0
粉丝关注
24
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994891
kk14977
6845357
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9982
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
601
alist如何将默认布局设置为图片布局
1009
Kali2025.4+Cherry Studio一键配置HexStrik
418
PHP 之高级面向对象编程 深入理解设计模式
416
PHP 之高级面向对象编程 深入理解设计模式
571
升级curl版本,及升级后引起的动态库链接不
294
2025年GEO优化服务商全景对比:五大核心维
779
AI Agent详解
983
Buildah 简明教程:让镜像构建更轻量,告别
610
OceanBase 在滴滴大规模运维经验以及新功能
975
[CSS+]HTML Learn Data Day 2
96
掌握相关性分析:读懂数据间的“悄悄话”
138
嵌入式UI框架-抗锯齿画圆弧算法
935
嵌入式UI框架的渐变原理、渐变算法
220
日本股票 API 对接实战指南(实时行情与 IP
563
解决Docker磁盘空间告急:认识并清理“悬空
394
别再只会算直线距离了!用“马氏距离”揪出
530
企业进行信息化后,一定会提高效率吗?真相
516
n8n整合ffmpeg
492
从random随机数看验证码重复数字
525
OceanBase 向量索引优化指南