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
来初始化对象!