目录
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<int> 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 <array> #include <algorithm> std::array<int, 5> 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<int> vals{1, 2, 3, 4, 45};
在这里,编译器会在内部创建一个包含整数1、2、3、4、45的数组,然后将该数组的地址和大小传递给std::initializer_list<int>
的构造函数。这个构造函数接受一个指向数组的指针和数组的大小,以便在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<value_type> __l,const allocator_type& __a = allocator_type()): _Base(__a){_M_range_initialize(__l.begin(), __l.end(),random_access_iterator_tag());}
vector存在一个
vector(initializer_list<value_type> __l,
const allocator_type& __a = allocator_type())
: _Base(__a)的构造函数 ,参数接受(initializer_list<value_type>