列表初始化和直接返回复合结构
在 C++11 及更高版本中,列表初始化(List Initialization) 和 直接返回复合结构 的语法极大地简化了代码编写,特别是在处理 STL 容器(如 vector、pair、map 等)时。以下是系统介绍和相关用法:
1. 列表初始化(Uniform Initialization)¶
C++11 引入了 {} 初始化语法,适用于:
• 基本类型(int, double 等)
• STL 容器(vector, map, set 等)
• 自定义结构体/类(如果支持 std::initializer_list)
基本用法¶
优势¶
• 避免 = 导致的隐式类型转换(更安全)
• 支持直接初始化容器,无需多次 push_back
• 适用于函数返回(如 return {1, 2};)
2. 直接返回复合结构¶
(1) 返回 vector¶
等价于:
(2) 返回 pair¶
等价于:
(3) 返回 map¶
(4) 返回自定义结构体¶
3. 在 STL 容器中的应用¶
(1) vector 初始化¶
(2) map 初始化¶
(3) set 初始化¶
(4) array 初始化(固定大小数组)¶
4. 在函数参数中的应用¶
(1) 接受 initializer_list 的函数¶
(2) 构造对象时使用 {}¶
5. 注意事项¶
-
auto推导• 在 C++17 后,auto x{1};会推导为int,而不是initializer_list。 -
窄化转换(Narrowing Conversion)
•{}初始化会检查窄化转换,更安全。 -
自定义类的
initializer_list支持
6. 总结¶
| 语法 | 适用场景 | 示例 |
|---|---|---|
T{...} |
初始化变量 | vector<int> v{1, 2, 3}; |
return {...}; |
直接返回复合结构 | return {1, 2}; |
f({...}) |
传入初始化列表 | printNumbers({1, 2, 3}); |
auto x = {...} |
推导 initializer_list |
auto lst = {1, 2, 3}; |
优点:
✔ 代码更简洁
✔ 避免隐式类型转换(更安全)
✔ 适用于 STL 容器和自定义类型
适用版本:C++11 及以上。