我们之前不是模拟实现过STL里面的各种容器的,那以vector为例,我们来对它改造一下,让它也支持用initializer_list进行{}初始化和赋值。 怎么做呢?给它增加这个构造函数就行了 🆗,每增加之前我们自己的vector肯定是不行的,而且大家看这个报错,编译器自动就把后面的常量数组识别成initializer list类型了 我们来写一下...
于是优点很明显:相比于在堆区分配内存构造一个完整的std::vector,std::initializer_list构建了一个临时...
std::vector<int> nums3;// 从 nums1 复制赋值数据到 nums2nums2 = nums1;//此时nums2 = {3, 1, 4, 6, 5, 9}// 从 nums1 移动赋值数据到 nums3,// 修改 nums1 和 nums3nums3 = std::move(nums1);//此时 nums1 = {}, nums3 = {3, 1, 4, 6, 5, 9}// initializer_list 的...
这里定义了两个自定义容器,一个是 FooVector,采用 std::vector<int> 作为内部存储;另一个是 FooMap,采用 std::map<int, int> 作为内部存储。 可以看到, FooVector、 FooMap 的初始化过程,就和它们使用的内部存储结构一样。 这两个自定义容器的构造函数中, std::initializer_list 负责接收初始化列表。并通过...
initializer_list是一种标准库类型,用于表示某种特定类型的值的数组。和vector一样,initializer_list也是一种模板类型,定义initializer_list对象时,必须说明列表中所含元素的类型。和vector不一样的是,initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。
*/ vector& operator=( std::initializer_list<T> ilist ); //C++11 起, C++20 前 constexpr vector& operator=( std::initializer_list<T> ilist ); //C++20 起 复杂度: 1的复杂度与 *this 和other 的大小成线性。 2的复杂度与 *this 的大小成线性,除非分配器不比较相等且不传播,该情况下与 ...
std::vector<int> nums3;// 从 nums1 复制赋值数据到 nums2nums2 = nums1;//此时nums2 = {3, 1, 4, 6, 5, 9}// 从 nums1 移动赋值数据到 nums3,// 修改 nums1 和 nums3nums3 = std::move(nums1);//此时 nums1 = {}, nums3 = {3, 1, 4, 6, 5, 9}// initializer_list 的...
例如,我们可以创建自定义容器,如FooVector(基于std::vector)和FooMap(基于std::map),它们的初始化过程直接反映出其内部存储结构。std::initializer_list负责接收初始化列表,通过for循环逐个将元素插入容器内部。std::initializer_list不仅可以用于自定义类型初始化,还能传递同类型的数据集合。它拥有...
std::initializer_list是C++11引入的一个轻量级类模板,用于支持任意长度的初始化列表。以下是关于std::initializer_list的详细解释:支持任意长度初始化:在C++11中,STL容器如std::map、std::set和std::vector等,以及自定义类型,都可以通过std::initializer_list来支持任意长度的初始化列表。自定义类型...
使用std::initializer_list 初始化 基本概念:使用 C++11 引入的 initializer_list 来初始化 std::string 对象。 示例代码: cpp std::string str = {'h', 'e', 'l', 'l', 'o'}; 适用场景:当你希望用类似数组初始化的语法来创建 std::string 对象时。 在使用 std::string 时,需要注意以下事项:...