Xiao's Blog

Sep 30, 2025

array、vector、list的区别

下面分别介绍 C++ 标准库中的 arrayvectorlist 的区别:


array 和 vector 的区别

特性 array vector
定义方式 std::array<T, N> std::vector<T>
容量 固定(编译期已知大小) 动态(运行时可扩展)
内存分配 通常在栈上(连续空间) 在堆上(连续空间)
能否改变大小 不能,创建后大小固定 可以自动扩容/缩小
性能 访问速度快(和原生数组一样) 访问速度快,扩容时有开销
用途 大小已知且固定的数组 需频繁增删元素的场景

举例:

1
2
3
std::array<int, 5> arr = {1, 2, 3, 4, 5};     // 固定长度,不能扩容
std::vector<int> vec = {1, 2, 3, 4, 5}; // 可动态扩容
vec.push_back(6); // 支持动态插入

vector 和 list 的区别

特性 vector list
底层结构 数组(连续内存) 双向链表
访问速度 随机访问快(O(1)) 随机访问慢(O(n))
插入/删除 尾部效率高,头部/中间慢 任意位置插入/删除都快
内存使用 连续空间,内存碎片少 每个节点有额外指针开销
适用场景 需频繁随机访问或尾部操作 需频繁在中间插入/删除

举例:

1
2
3
4
5
6
std::vector<int> v = {1, 2, 3};
v.insert(v.begin() + 1, 4); // 插入效率低,可能整体搬移
std::list<int> l = {1, 2, 3};
auto it = l.begin();
std::advance(it, 1); // 移动到第二个元素
l.insert(it, 4); // 插入效率高

总结:

  • array:大小固定,适合已知长度的数组。
  • vector:动态数组,适合大量随机访问和尾部插入。
  • list:链表,适合频繁在任意位置插入/删除,但不适合随机访问。
OLDER > < NEWER