C++中的初始化程序列表– std :: initializer_list

时间:2020-02-23 14:29:59  来源:igfitidea点击:

在本文中,我们将介绍如何在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 &lt;>类型的对象。

第一个对象的模板参数是使用"自动"自动派生的,而我们在第二个对象中明确提到了它,因为我们不使用"自动"。

为什么我们要使用初始化列表?

这些列表的优点是您可以使用list.begin(),list.end()和list.size()方法进行遍历,因此它类似于矢量。

方法列表显示在Linux上的" initializer_list.h"文件的示例屏幕快照中。

初始化列表标题

Method NameWhat 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 &lt;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来初始化对象!