c++11中的std::initializer_list模板类
- c++11中的std::initializer_list模板类
- 一,std::initializer_list 是一个轻量级的容器,它包含了一系列的元素,并且这些元素在初始化列表中是连续的。
- 二,std::initializer_list 通常作为函数的参数,允许你传递一个初始化列表给该函数。
- 三,也可以使用 std::initializer_list 来初始化自定义类型的对象
- 四,此外仅采用一个std::initializer_list作为类参数的构造函数是一种特殊类型的构造函数,称为初始值设定项列表构造函数。使用初始值设定项列表构造函数语法时,初始值设定项列表构造函数优先于其他构造函数
- 五,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。
c++11中的std::initializer_list模板类
std::initializer_list 是 C++11 引入的一个模板类,它允许你使用花括号初始化语法来初始化对象。这在你需要创建一个集合(如数组、向量或自定义类型的集合)时特别有用。
此类型的对象由编译器根据初始化列表声明自动构造,该声明是用大括号括起来的逗号分隔元素的列表,类型是:const T,初始化列表如下
{10, 20, 30}
接下来通过一段代码验证该类型
#include<iostream>
using namespace std;
int main()
{
// the type of il is an initializer_list
auto il = { 10, 20, 30 };
cout << typeid(il).name() << endl;
return 0;
}
一,std::initializer_list 是一个轻量级的容器,它包含了一系列的元素,并且这些元素在初始化列表中是连续的。
对象是自动构造的,就好像分配了一个类型的元素数组一样,列表中的每个元素都使用任何必要的非缩小隐式转换复制初始化为数组中的相应元素。
二,std::initializer_list 通常作为函数的参数,允许你传递一个初始化列表给该函数。
下面是一个简单的列子
#include <iostream>
#include <vector>
#include <initializer_list>
void printVector(const std::initializer_list<int>& list) {
for (auto it = list.begin(); it != list.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main() {
printVector({1, 2, 3, 4, 5});
return 0;
}
在上面的代码中,我们定义了一个函数 printVector,它接受一个 std::initializer_list 类型的参数。在 main 函数中,我们使用花括号初始化语法来创建一个整数列表,并将其传递给 printVector 函数。
三,也可以使用 std::initializer_list 来初始化自定义类型的对象
#include <iostream>
#include <initializer_list>
class MyClass {
public:
MyClass(std::initializer_list<int> list) {
for (auto it = list.begin(); it != list.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
}
};
int main() {
MyClass obj{1, 2, 3, 4, 5};
return 0;
}
在这个例子中,我们定义了一个 MyClass 类,它有一个接受 std::initializer_list 参数的构造函数。在 main 函数中,我们使用花括号初始化语法来创建一个 MyClass 对象,并传递一个整数列表给构造函数。
四,此外仅采用一个std::initializer_list作为类参数的构造函数是一种特殊类型的构造函数,称为初始值设定项列表构造函数。使用初始值设定项列表构造函数语法时,初始值设定项列表构造函数优先于其他构造函数
struct myclass {
myclass (int,int);
myclass (initializer_list<int>);
/* definitions ... */
};
myclass foo {10,20}; // calls initializer_list ctor
myclass bar (10,20); // calls first constructor
上图代码中{10,20}整体作为一个类参数的构造函数优先构造执行,而(10,20)作为两个参数传入的构造函数后构造执行。
五,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。
如下列
int main()
{
vector<int> v{ 1,2,3,4 };
list<int> lt{ 1,2 };
// 这里{"sort", "排序"}会先初始化构造一个pair对象
map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
// 使用大括号对容器赋值
v = {10, 20, 30};
}```