C++中的初始化程序列表– std :: initializer_list
在本文中,我们将介绍如何在C++中使用初始化程序列表(std :: initializer_list)。
每当实现自己的Class时,您可能都想要一种使用列表类型格式(使用{})直接初始化对象的方法。
初始化列表可以实现这一点,并使您的生活更轻松。
注意:这不要与另一个主题,称为成员初始化程序列表混淆
了解初始化程序列表
初始化列表是一个类,它在<initializer_list.h>头文件中定义。
要使用此文件,我们必须包含此头文件。
这也是模板类,因此我们可以将任何类型作为模板参数传递给它。
template <class Type> class initializer_list
其中"类型"是我们传递给类的模板参数。
此类也定义在名称空间" std"(标准名称空间)下。
因此,此类的完整规范路径为:std :: initializer_list。
我们来看一些使用std :: initializer_list的简单示例。
要声明这种类型的对象,我们可以使用{{}表示法进行初始化,并使用auto`关键字进行自动类型推断。
#include <iostream>
#include <string>
#include <initializer_list>
int main() {
//Declare an object of initializer_list
auto init_list = { 1, 2, 3, 4, 5 };
//Using std::string as a template argument for the initializer list
std::initializer_list<std::string> il = { "Hello", "from", "theitroad" };
return 0;
}
其中我们创建了两个std :: initializer_list <>类型的对象。
第一个对象的模板参数是使用"自动"自动派生的,而我们在第二个对象中明确提到了它,因为我们不使用"自动"。
为什么我们要使用初始化列表?
这些列表的优点是您可以使用list.begin(),list.end()和list.size()方法进行遍历,因此它类似于矢量。
方法列表显示在Linux上的" initializer_list.h"文件的示例屏幕快照中。
初始化列表标题
| Method Name | What does it do? |
| initializer_list.size() | Returns the size of the list (Similar to vector.size()) |
| initializer_list.begin() | Returns an iterator to the first element of the list (Similar to vector.begin()) |
| initializer_list.end() | Returns an iterator to an element after the last element of the list (Similar to vector.end()) |
如您所见,它具有诸如size(),begin()和end()之类的方法,这些方法对于遍历列表是必需的。
要了解其工作原理,我们需要创建一个类,并将此初始值设定项列表传递给其构造函数。
#include <iostream>
#include <initializer_list>
template <typename T>
class MyClass {
public:
MyClass(std::initializer_list<T> init_list) {
//We can iterate through the initializer list
for (auto it = init_list.begin(); it != init_list.end(); ++it) std::cout << *it << std::endl;
}
};
此类也必须是模板类,因为初始化列表使用模板参数。
因此,我们将其称为模板类MyClass。
template <typename T>
class MyClass {
public:
int value;
//Default constructor
MyClass() { std::cout << "Default constructor\n"; value = -1; }
//Parametrized constructor
MyClass(int b = 100) { std::cout << "Parametrized constructor\n"; value = b; }
//Constructor using std::initializer_list
MyClass(std::initializer_list<T> init_list) {
std::cout << "Initializer List Constructor\n";
std::cout << "Iterating through the initializer_list<>\n";
for (auto it = init_list.begin(); it != init_list.end(); ++it) {
std::cout << "Current element in list = " << *it << std::endl;
}
//Set value = 20;
value = 20;
}
};
它接受模板参数" T",并根据所调用的构造函数将" value"设置为特定值。
要使用初始化列表,我们必须创建一个带有std :: initializer_list <T>作为参数的构造函数。
然后,我们可以遍历此列表并将其分配给对象。
为了本文的方便,我们将仅打印列表中的项目。
现在来看完整的程序。
#include <iostream>
#include <string>
#include <initializer_list>
template <typename T>
class MyClass {
public:
int value;
//Default constructor
MyClass() { std::cout << "Default constructor\n"; value = -1; }
//Parametrized constructor
MyClass(int b = 100) { std::cout << "Parametrized constructor\n"; value = b; }
//Constructor using std::initializer_list
MyClass(std::initializer_list<T> init_list) {
std::cout << "Initializer List Constructor\n";
std::cout << "Iterating through the initializer_list<>\n";
for (auto it = init_list.begin(); it != init_list.end(); ++it) {
std::cout << "Current element in list = " << *it << std::endl;
}
//Set value = 20;
value = 20;
}
};
int main() {
//Declare an object of initializer_list
auto init_list = { 1, 2, 3, 4, 5 };
//Using std::string as a template argument for the initializer list
std::initializer_list<std::string> il = { "Hello", "from", "theitroad" };
MyClass<int> my_obj = MyClass<int>(500);
//Create an instance of MyClass using initializer lists
MyClass<std::string> my_obj_il = { il };
std::cout << "Value of normal instance: " << my_obj.value << std::endl;
std::cout << "Value of instance constructed using initializer_list: " << my_obj_il.value << std::endl;
return 0;
}
其中我们通过以下调用使用" initializer_list"构造一个对象:
std::initializer_list<std::string> il = { "Hello", "from", "theitroad" };
初始化列表构造函数将在此行调用。
输出
Parametrized constructor Initializer List Constructor Iterating through the initializer_list<> Current element in list = Hello Current element in list = from Current element in list = theitroad Value of normal instance: 500 Value of instance constructed using initializer_list: 20
确实,我们的输出似乎证实了我们想要的!我们终于使用了std :: initializer_list来初始化对象!

