目录
std::initializer_list 和 std::array
std::initializer_list 的作用:
std::array 的作用:
std::initializer_list 和 std::array 使用联系
标准库里面的initializer_list 使用
vector
std::initializer_list
和 std::array
std::initializer_list
和 std::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
提供了类型安全的数组访问,而且它知道自己的大小,可以通过成员函数获取大小。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_list
和 std::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
const allocator_type& __a = allocator_type())
: _Base(__a)的构造函数 ,参数接受(initializer_list