我们之前不是模拟实现过STL里面的各种容器的,那以vector为例,我们来对它改造一下,让它也支持用initializer_list进行{}初始化和赋值。 怎么做呢?给它增加这个构造函数就行了 🆗,每增加之前我们自己的vector肯定是不行的,而且大家看这个报错,编译器自动就把后面的常量数组识别成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 的...
之后,我们对 std::initializer_list 进行赋值操作(注意,它只能通过初始化列表赋值),可以发现 std::initializer_list 被改写成了 {1, 2, 3, 4, 5}。 然后,还可以对它再次赋值, std::initializer_list 被修改成了 {3, 1, 2, 4}。 看到这里,可能有读者会关心 std::initializer_list 的传递或赋值效率。
()和{}的表现完全一样,vector2(1, 2, 3)和vector2{1, 2, 3}都是可行的 支持move-only类型 支持异构列表的CTAD(vector2{1, 2, 3.0} -> vector2<double>) 更好的推导能力:std::make_unique<vector<int>>({1, 2, 3})自然是不行的,因为initializer-list不能完美转发;std::make_unique<vector2<...
initializer_list是一种标准库类型,用于表示某种特定类型的值的数组。和vector一样,initializer_list也是一种模板类型,定义initializer_list对象时,必须说明列表中所含元素的类型。和vector不一样的是,initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。
例如,我们可以创建自定义容器,如FooVector(基于std::vector)和FooMap(基于std::map),它们的初始化过程直接反映出其内部存储结构。std::initializer_list负责接收初始化列表,通过for循环逐个将元素插入容器内部。std::initializer_list不仅可以用于自定义类型初始化,还能传递同类型的数据集合。它拥有...
问使用initializer_list构造的std::vector的行为与预期不符EN版权声明:本文内容由互联网用户自发贡献,该...
使用std::initializer_list 初始化 基本概念:使用 C++11 引入的 initializer_list 来初始化 std::string 对象。 示例代码: cpp std::string str = {'h', 'e', 'l', 'l', 'o'}; 适用场景:当你希望用类似数组初始化的语法来创建 std::string 对象时。 在使用 std::string 时,需要注意以下事项:...
"{1, 2, 3}" 不是表达式,// 它没有类型,所以不能推导出 Ttemplated_fn<std::initializer_list<int>>({1,2,3});// OKtemplated_fn<std::vector<int>>({1,2,3});// 同样 OK} 输出: 以包含 5 个元素的列表构造 现在 vector 含有 8 个 int: 1 2 3 4 5 6 7 8 用范围 for 遍历花...
因为模板参数推导为initializer_list,而参数传递需要的是vector,使用这种方式还得手动创建一个临时的vector。 所以,具体问题具体分析,才能选择最恰当的方式,有时甚至可以组合使用。 大家也许注意到,开销对比图标题为"初始化Long String成员开销图",那么还有短String吗?