圆括号vector(n, val)调用指定大小和初值的构造函数,如vector(5,1)创建5个1;花括号vector{a,b,c}优先列表初始化,如vector{5,1}为两个元素5和1,不等价于前者。

圆括号 vector<int>(n, val)</int> 调用的是构造函数重载
它明确匹配 vector(size_type n, const T& val) 这个构造函数,参数含义固定:第一个是元素个数,第二个是每个元素的初值。比如 vector<int>(5, 1)</int> 就是“我要 5 个整数,每个都初始化为 1”。
这种写法不会歧义,编译器直接走对应构造函数,不查 initializer_list。
花括号 vector<int>{a, b, c}</int> 优先尝试列表初始化
编译器会先看能不能把花括号里的内容当作元素列表来用。能就用——vector<int>{5}</int> 是 1 个元素(值为 5),vector<int>{5, 1}</int> 是 2 个元素(5 和 1)。
只有当花括号内参数无法构成合法列表时,才会退回去尝试构造函数,比如 vector<int>{5, 1, "hello"}</int> 编译不过,但 vector<int>{5, 1}</int> 绝对不会变成“5 个 1”。
常见误判点:vector<int>{5, 1}</int> ≠ vector<int>(5, 1)</int>,前者是两个元素,后者是五个。
混用或边界情况容易踩坑
以下情形必须特别注意:
-
vector<int> v(5)</int>→ 5 个 0(调用vector(size_type)) -
vector<int> v{5}</int>→ 1 个元素,值为 5(列表初始化) -
vector<int> v = {5}</int>→ 同上,仍是列表初始化 -
vector<int> v(1, 5)</int>→ 1 个元素,值为 5(数量=1,初值=5) -
vector<int> v{1, 5}</int>→ 2 个元素,值分别为 1 和 5
别因为怕出错就把所有 () 换成 {}——语义完全不同,改了可能让逻辑彻底跑偏。
立即学习“C++免费学习笔记(深入)”;
什么时候该用哪种?
按意图选:
- 想指定“多少个、每个值多少” → 用圆括号,如
vector<string>(3, "abc")</string> - 想直接列出所有初始值 → 用花括号,如
vector<int>{1, 1, 2, 3, 5}</int> - 在模板推导或 auto 场景下,
auto v = vector<int>{1,2,3}</int>更安全,因为类型和内容一目了然;而auto v = vector<int>(3)</int>你得额外记住“这是三个零”
最常被忽略的一点:花括号禁止隐式窄化转换,比如 vector<int>{3.14}</int> 直接报错,而 vector<int>(1, 3.14)</int> 会静默截断成 3——这个差异在强类型检查场景里可能救你一命。


















