石家庄网站关键词,培训中心,哈尔滨市建设工程交易网,门户网站建设开发需要注意什么一、什么是initializer_list?
nitializer_list 是一种C11新的类型特性#xff0c;它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器#xff0c;通常用于构造函数和函数参数中#xff0c;以允许传递一个初始化元素列表。 initializer_list也是一种模板类…一、什么是initializer_list?
nitializer_list 是一种C11新的类型特性它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器通常用于构造函数和函数参数中以允许传递一个初始化元素列表。 initializer_list也是一种模板类型。 template class T class initializer_list; 该类模板中主要有三个方法begin()、end()迭代器以及获取区间中元素个数的方法size() 保存的只是指向一个常量无法对其修改 C11允许构造函数和其他函数把初始化列表当做参数。
二、为什么要使用initializer_list?
1.需要传入不确定个数的实参时
#include initializer_list
#include iostreamvoid print(std::initializer_listint ilist) {for (auto elem : ilist) {std::cout elem ;}std::cout std::endl;
}int main() {print({1, 2, 3, 4, 5}); // 输出1 2 3 4 5return 0;
}print函数的形参列表是std::initializer_listint ilist,所以我们在调用print函数时就可传入任意个数的参数
2.快速对STL容器进行初始化
对于STL的container的初始化就方便多了,比如以前初始化一个vector需要这样
std::vector v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);在c11添加了initializer_list后我们可以这样初始化
std::vector v { 1, 2, 3, 4 };3.多个对象的列表初始化
class Date
{
public:Date(int year 0, int month 1, int day 1):_year(year), _month(month), _day(day){cout 这是日期类 endl;}private:int _year;int _month;int _day;
};
int main()
{//C11容器都实现了带有initializer_list类型参数的构造函数vectorDate vd { { 2022, 1, 17 }, Date{ 2022, 1, 17 }, { 2022, 1, 17 } };return 0;
}
三、优缺点
优点
(1).统一初始化语法使用 initializer_list可以为不同的容器和对象类型提供统一的初始化语法。 (2).简化构造函数重载可以用一个接受 initializer_list 参数的构造函数替代多个重载版本。 (3).支持范围 for 循环initializer_list 支持基于范围的 for 循环使得遍历元素变得非常简洁。
缺点
(1).只读initializer_list 中的元素是只读的你不能修改其中的元素。 (2).性能考虑使用 initializer_list 可能涉及数组的复制尤其是在传递给构造函数或函数时。 (3).生命周期initializer_list 引用的元素数组的生命周期与 initializer_list 对象的生命周期相同这可能导致悬垂引用的风险。