uniform initialization(一致化初始化)

目录

std::initializer_list 和 std::array

         std::initializer_list 的作用:

         std::array 的作用:

std::initializer_list 和 std::array 使用联系 

标准库里面的initializer_list 使用

         vector


std::initializer_liststd::array

std::initializer_liststd::array 是用于不同目的的两个工具,它们各自有其优势和适用场景。

std::initializer_list 的作用:

void exampleFunction(std::initializer_list values) { // 处理传入的初始化列表 } // 调用 exampleFunction({1, 2, 3, 4, 45}); 
  • 初始化列表的方便性: std::initializer_list 提供了一种方便的语法,允许使用花括号 {} 直接初始化列表,而不需要显式地创建数组。
  • 适应不同数量的参数: std::initializer_list 允许在函数和构造函数的参数中以初始化列表的形式接收多个参数,而且不限制参数个数。这使得函数更加灵活,能够适应不同数量的参数。
  • 自动大小: std::initializer_list 会自动记录初始化列表的大小,而不需要手动指定数组大小。

std::array 的作用:

  • 静态数组: std::array 是一个静态数组容器,其大小在编译时确定。它提供了数组的所有特性,如随机访问、迭代器支持等。
  • 类型安全: std::array 提供了类型安全的数组访问,而且它知道自己的大小,可以通过成员函数获取大小。
  • 支持STL算法: 由于 std::array 符合 STL 容器的接口,因此可以直接使用许多标准库算法。
#include  #include  std::array arr = {1, 2, 3, 4, 45}; // 使用 STL 算法 std::sort(arr.begin(), arr.end()); 

选择使用哪个取决于具体的需求。如果你需要一个动态数量的参数集合,并且方便地进行初始化和传递,那么 std::initializer_list 可能更适合。如果你需要一个静态大小的数组,而且想要利用数组的其他特性,那么 std::array 可能更为合适。在某些情况下,它们也可以一起使用,根据具体情况选择更适合的工具。

std::initializer_liststd::array 使用联系 

在使用初始化列表语法创建std::initializer_list对象时,编译器会在后台创建一个临时的数组array,并将该数组的地址和大小作为参数传递给std::initializer_list的构造函数。

std::initializer_list vals{1, 2, 3, 4, 45}; 

在这里,编译器会在内部创建一个包含整数1、2、3、4、45的数组,然后将该数组的地址和大小传递给std::initializer_list的构造函数。这个构造函数接受一个指向数组的指针和数组的大小,以便在std::initializer_list对象内部维护这些信息。

所以,在实际情况中,std::initializer_list对象是基于一个临时数组构造的。这个临时数组的生命周期将与std::initializer_list对象的生命周期一样,它只存在于初始化期间,而不会被保留下来。

initializer_list 的初始化只是浅拷贝,不是深拷贝

标准库里面的initializer_list 使用

标准库里面使用了很多的initializer_list 使得参数个数多样性

vector

 /**
       *  @brief  Builds a %vector from an initializer list.
       *  @param  __l  An initializer_list.
       *  @param  __a  An allocator.
       *
       *  Create a %vector consisting of copies of the elements in the
       *  initializer_list @a __l.
       *
       *  This will call the element type's copy constructor N times
       *  (where N is @a __l.size()) and do no memory reallocation.
       */
      vector(initializer_list __l,
	     const allocator_type& __a = allocator_type())
      : _Base(__a)
      {
	_M_range_initialize(__l.begin(), __l.end(),
			    random_access_iterator_tag());
      }

vector存在一个  vector(initializer_list __l,
         const allocator_type& __a = allocator_type())
      : _Base(__a)的构造函数 ,参数接受(initializer_list

你可能感兴趣的:(c++,c++新特性,c++)