一:作用
std::initializer_list 是 C++11 引入的一个新特性,它允许你在函数参数中传递一个花括号 {} 初始化的列表。这个列表是临时的,并且主要用于初始化数组、容器或其他需要多个初始值的对象,函数实参数量未知且全部实参类型都是相同的。
例子:
#include <iostream>
#include <initializer_list>
// 函数接受一个 int 类型的 initializer_list
void print_numbers(std::initializer_list<int> nums)
{
for (int num : nums) {
std::cout << num << ' ';
}
std::cout << '\n';
}
int main()
{
// 使用花括号 {} 初始化一个 int 类型的 initializer_list
// 这个列表包含任意数量的 int 元素
print_numbers({1, 2, 3, 4, 5}); // 可以传递5个int
print_numbers({6, 7, 8}); // 可以传递3个int
print_numbers({}); // 甚至可以传递一个空的列表
return 0;
}
注意:initializer_list对象元素永远是只读的(不可修改),不能保存引用或指针,其生命周期与它的作用域相同。
三、初始化方式
- 默认初始化
std::initializer_list<T> lst;
- 列表初始化
std::initializer_list<T> lst{1,2,3,4,5};
- 拷贝初始化
std::initializer_list<int> lst1{1,2,3,4,5};
std::initializer_list<int> lst2(lst1);
- 赋值初始化
std::initializer_list<int> lst3;
lst3 = lst1;
四、其他操作
initializer_list也是模板类型,用法于vector相似
- 列表中的元素数量
lst.size();
- 首元素指针和尾元素的下一个位置
lst.begin();
lst.end();
五、优点和缺点
优点
- 灵活性和扩展性:
std::initializer_list 可以用于任何需要可变数量参数的函数中,提供了高度的灵活性和扩展性。你可以编写一个接受 std::initializer_list 参数的函数,使其能够接受任意数量的元素进行初始化。 - 兼容性:
std::initializer_list 可以与现有的容器(如 std::vector、std::array、std::list 等)一起使用,使它们能够更容易地接受初始化列表。
缺点:
-
不支持动态大小调整:
一旦使用 std::initializer_list 初始化一个对象,其大小将被确定,并且不能再进行动态大小调整。这意味着你不能像使用其他容器(如 std::vector)那样在运行时添加或删除元素。 -
只读性:
std::initializer_list 是一个只读的容器,不支持添加、删除或修改元素。你只能遍历它并访问其元素。 -
临时性:
std::initializer_list 对象通常是临时的,并且只在创建它们的代码块中存在。这可能会限制其使用范围,特别是在需要长时间保留或跨多个函数传递初始化列表的情况下。