std::array适用于编译期确定大小的数组,支持聚合初始化和类型安全;std::vector适用于运行时大小或需动态增删的场景;原生数组仅支持定义时初始化,不支持赋值;自定义类需满足聚合要求或提供合适构造函数。

用 std::array 初始化列表赋值最直接
如果你确定数组大小在编译期已知,std::array 是首选。它支持聚合初始化,语法简洁且类型安全。
- 直接用花括号初始化:
std::array<int> a = {1, 2, 3};</int> - 省略类型推导(C++17 起):
auto a = std::array{1, 2, 3};—— 此时 size 和 type 都自动推导 - 未显式初始化的元素会进行值初始化(如
int变成0),不是未定义值:std::array<int> b{};</int>中所有元素都是0
注意:不能用 = {0} 这种 C 风格“全零初始化”来给 std::array 赋初值(如 std::array<int> b = {0};</int> 只初始化第一个元素,其余为 0 是因为值初始化补位,但语义易混淆,不推荐)。
动态大小?用 std::vector 构造函数指定初始值
运行时才知道长度,或需要后续增删元素,就该用 std::vector。它的构造函数能明确控制初始值和数量。
- 全为同一值:
std::vector<int> v(10, 42);</int>→ 10 个42 - 从 initializer_list 初始化:
std::vector<double> w = {1.1, 2.2, 3.3};</double> - 空容器但预留空间(避免多次扩容):
std::vector<char> buf; buf.reserve(1024);</char>—— 此时元素数仍为 0,不产生初始值
别误用 resize() 替代构造:比如 v.resize(5, 99) 确实会让 vector 变成 5 个 99,但它适用于已有 vector 的调整;首次创建时直接用构造函数更清晰、无冗余操作。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
原始数组(T[N])只能靠聚合初始化或循环赋值
C++ 原生数组不支持默认构造或统一赋值语法,初始化必须在定义时完成,或靠手动填充。
- 定义即初始化(推荐):
int arr[4] = {10, 20, 30, 40};或int arr[] = {1, 2, 3}; - 全零初始化:
int arr[100] = {};—— 注意是= {},不是= {0}(后者虽也清零,但语义不明确) - 千万别写
int arr[5]; arr = {1,2,3,4,5};—— 编译错误,原生数组不可赋值 - 若必须运行时填值,老实用循环或
std::fill:std::fill(std::begin(arr), std::end(arr), -1);
原生数组没有成员函数、不记录 size、不管理内存,容易越界或误判长度,除非对接 C API 或做极致性能优化,否则应优先考虑 std::array 或 std::vector。
自定义类数组元素?确保类型支持对应初始化方式
如果数组元素是自定义类(比如 struct Point { int x, y; };),能否用上述方式初始化,取决于类是否满足要求。
- 聚合类(无用户定义构造函数、无私有/保护非静态成员等)才能用
{...}初始化:std::array<point> p = {{{0,0}, {1,1}}};</point> - 若类有构造函数,需确保该构造函数是
explicit的(否则std::vector<point>(10, {1,2})</point>可能因隐式转换失败) - 若类含
const成员或引用成员,可能无法被std::vector::resize()或某些 fill 操作调用(因需调用默认构造或拷贝)
常见坑:定义了任何构造函数后,编译器不再生成默认构造函数,这时 std::vector<myclass>(10)</myclass> 会编译失败——必须显式提供默认构造函数,或改用带参数的构造方式。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










