vector 与 list 区别 + 使用场景
一、底层结构
- vector :动态数组,连续内存空间,基于数组扩容实现
- list :双向循环链表,不连续内存,每个节点存数据+前后指针
二、核心区别
-
内存布局
- vector:连续内存
- list:碎片化非连续内存
-
随机访问
- vector:支持
[]、at(),O(1) 随机访问 - list:不支持随机访问,只能遍历迭代,访问中间元素 O(n)
- vector:支持
-
插入/删除
- vector:中间插入删除O(n),需要搬移元素;尾部快
- list:任意位置插入删除O(1),只改指针,不搬数据
-
扩容机制
- vector:满了自动扩容、重新分配内存、拷贝元素、迭代器容易失效
- list:无扩容概念,每次新增只分配单个节点,迭代器不易失效
-
空间占用
- vector:内存紧凑,额外开销小
- list:每个节点多两个指针,内存开销更大,缓存不友好
-
迭代器失效
- vector:插入/删除、扩容极易失效
- list:仅被删除节点的迭代器失效,其他不受影响
三、使用场景
用 vector 的场景
- 需要频繁随机访问、下标取值
- 大部分操作是尾部增删,中间很少插入删除
- 追求缓存命中率、内存紧凑
- 普通数组、存储数据列表、缓冲区、容器默认首选
用 list 的场景
- 任意位置频繁插入、删除
- 不需要随机访问,只顺序遍历
- 不希望迭代器轻易失效
- 任务队列、频繁增减节点、链表结构业务
随机访问、尾部操作用 vector;频繁中间插删、不随机访问用 list。