vector支持O(1)随机访问,list为O(n);vector尾部增删均摊O(1),中间操作O(n),list任意位置增删O(1)但查找位置O(n);vector内存紧凑缓存友好,list节点额外占空间且内存分散;vector迭代器易失效,list仅删除时对应迭代器失效。

vector 是连续内存的动态数组,list 是双向链表。这个根本差异决定了它们在插入删除、随机访问、内存占用和迭代器稳定性上的表现完全不同。
随机访问快不快?
vector 支持 O(1) 时间的下标访问(v[i] 或 v.at(i)),因为数据在内存中是连续存放的,地址可直接计算。
list 不支持高效随机访问,要找第 n 个元素得从头或尾逐个遍历,时间复杂度是 O(n)。即使你写了 std::next(it, n),本质还是走 n 步。
在哪插、在哪删?效率差很多
- vector 尾部插入/删除(
push_back/pop_back)很快,均摊 O(1);但中间或头部插入/删除要移动大量元素,最坏 O(n) - list 在任意位置插入/删除都是 O(1),前提是已经拿到那个位置的迭代器(比如用
insert(it, x))。但注意:找到那个位置本身可能花 O(n)
内存开销与缓存友好性
vector 内存紧凑,所有元素挨着放,CPU 缓存命中率高,遍历起来飞快。
list 每个节点除了存数据,还要存两个指针(前驱+后继),典型多占 16 字节(64 位系统),内存分散,缓存不友好。小对象场景下,list 的内存开销可能比数据本身还大。
迭代器失效规则不同
- vector:只有插入导致扩容(如
push_back超出容量)时,所有迭代器、引用、指针全部失效;删除只让被删元素及之后的迭代器失效 - list:插入不使任何迭代器失效;删除只让指向被删节点的迭代器失效,其他全保留
基本上就这些。选 vector 还是 list,关键看操作模式:频繁随机读写、尾部增删、重视缓存 → 用 vector;需要在中间高频插入/删除且已有稳定迭代器位置 → list 才有优势。现实中 vector 更常用,list 使用场景其实比较窄。
立即学习“C++免费学习笔记(深入)”;











