C++ 的 vector 与 array:用哪个?

先给短答案,再讲面试和真实代码里真正要紧的细节。

十秒答案

默认用 std::vector。只有当"大小是题目的一部分"时才用定长数组(而且用 std::array,不用 C 数组)。后面全在解释为什么 — 因为"就用 vector"这句话扛不住追问。

三种容器,一个思想

C 数组std::arraystd::vector
大小编译期固定编译期固定运行期可增可减
住在哪声明处(局部就在栈上)声明处数据在堆;对象本身随便放
知道自己多长吗不知道 — 自己记知道 — .size()知道 — .size()
可拷贝?不行(退化成指针)行行
传进函数别扭(变指针,长度丢失)干净干净
越界检查无.at() 有.at() 有,[] 无

各自长什么样

#include <array>
#include <vector>

int main() {
    int raw[5] = {1, 2, 3, 4, 5};          // C 数组:大小是类型的一部分
    std::array<int, 5> fixed = {1, 2, 3, 4, 5}; // 定长,但是真类型
    std::vector<int> grow = {1, 2, 3};     // 可变长

    grow.push_back(4);                     // 现在装着 1 2 3 4
    return 0;
}

注:浏览器练习场目前覆盖教学核心(iostream、cmath、cstdio……),这类片段请在桌面编译器上跑 — 或等练习场支持容器。

vector 为什么默认赢

什么时候定长数组真的更好

值得备好的面试追问

  1. "vector 怎么扩容?" 撞到容量时分配更大的块(常见 ~1.5× 或 2×)并把元素搬过去 — 所以反复 push_back 依然是摊还 O(1)。
  2. "vector<bool> 是什么?" — 陷阱题:它是按位打包的特化版本,行为不像普通 vector。
  3. "size() 和 capacity() 的区别?" — size() = 在用元素数;capacity() = 下次扩容前已开好的槽位。
  4. "vector 会让指针失效吗?" — 会:任何扩容或 insert/erase 都可能搬走存储。别在修改后保留指向 vector 内部的裸指针/引用。

经验法则

写 std::vector,直到测出不该用的理由。天然定长?用 std::array。裸 C 数组留给与 C 代码交互和极限嵌入式场景 — 即便那时也要包一层。