定义
std::initializer_list
是 C++11 引入的一个类模板,用于支持列表初始化。它允许开发者使用花括号 {}
提供一组值直接初始化容器或自定义类型。std::initializer_list
提供了一种简洁优雅的语法来传递多个值。
主要用途
-
初始化容器
使用列表初始化方式为容器赋值。#include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; for (int i : vec) { std::cout << i << " "; } return 0; }
输出:
1 2 3 4 5
-
构造函数重载
用于支持构造函数接受多参数的初始化列表。#include <iostream> #include <initializer_list> class MyClass { public: MyClass(std::initializer_list<int> values) { for (int value : values) { std::cout << value << " "; } std::cout << std::endl; } }; int main() { MyClass obj = {10, 20, 30, 40}; return 0; }
输出:
10 20 30 40
-
函数参数
用于函数接收可变数量参数的情景,提供了一种更直观的方式。#include <iostream> #include <initializer_list> void printValues(std::initializer_list<int> values) { for (int value : values) { std::cout << value << " "; } std::cout << std::endl; } int main() { printValues({5, 10, 15, 20}); return 0; }
输出:
5 10 15 20
区别分析
std::initializer_list
和传统的数组或 std::vector
的主要区别:
- 只读性:
std::initializer_list
的元素是只读的,无法修改。 - 临时性:
std::initializer_list
是轻量的,通常作为一个临时对象存在,生命周期受限。 - 用途:主要用于初始化操作,而
std::vector
更适合复杂的动态数组操作。
示例代码对比
数组与初始化列表对比:
#include <iostream>
#include <vector>
#include <initializer_list>
void modifyArray(std::vector<int>& arr) {
arr[0] = 99; // 可修改
}
void modifyInitList(std::initializer_list<int> values) {
// values[0] = 99; // 错误,std::initializer_list 是只读的
for (int value : values) {
std::cout << value << " ";
}
std::cout << std::endl;
}
int main() {
std::vector<int> arr = {1, 2, 3};
modifyArray(arr);
for (int val : arr) {
std::cout << val << " "; // 输出 99 2 3
}
std::cout << std::endl;
modifyInitList({4, 5, 6}); // 输出 4 5 6
return 0;
}
通过以上分析可以看到,std::initializer_list
提供了一种便捷但只读的方式来初始化或传递一组值,非常适合初始化容器和自定义类型。