class Foo { public: Foo(std::initializer_list<int>) {} }; Foo foo = { 1, 2, 3, 4, 5 }; // OK! 那么,知道了使用 std::initializer_list 来接收 {...},如何通过它来给自定义容器赋值呢?来看代码下面的例子。 class FooVector { std::vector<int> content_; public: FooVector(std::ini...
vector::vector(std::initializer_list<T>initList); 这个std::initializer_list<T> 类也像 STL 容器类一样,也提供迭代器,可以遍历其中的内容。 但与普通的容器类不一样的是,这个类是“一等公民”(first-class),由只能用{}这个语法进行初始化,而且只能由编译器来构建。构建成功就不能再改变(像 const ,呵呵...
当然除了用作构造函数,普通的函数也可以用std::initializer_list来传参,这个时候主要对标的是用std::v...
例如,我们可以创建自定义容器,如FooVector(基于std::vector)和FooMap(基于std::map),它们的初始化过程直接反映出其内部存储结构。std::initializer_list负责接收初始化列表,通过for循环逐个将元素插入容器内部。std::initializer_list不仅可以用于自定义类型初始化,还能传递同类型的数据集合。它拥有轻...
initializer_list是一种标准库类型,用于表示某种特定类型的值的数组。和vector一样,initializer_list也是一种模板类型,定义initializer_list对象时,必须说明列表中所含元素的类型。和vector不一样的是,initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。
std::initializer_list<T>类型对象是一个访问const T类型对象数组的轻量代理对象。 与vector不同的是,initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。 作用 方便了对于STL的container的初始化 例如:之前初始化一个vector需要这样: ...
最基础的思想就是vector{1, 2, 3, 4, 5}除了可以调用initializer_list构造函数以外,还可以(作为fallback)调用一个5参数的构造函数。这样,如果我们提供一个任意参数的构造函数,提前reserve一下,然后完美转发给emplace_back来就地构造所有的元素,理论上是不会损耗性能的。 改进 上面这个简单实现一眼望去问题就一大...
但通过std::initializer_list让cpp间接支持了不定长参数,但类型要同构的。 很多class都支持std::initializer_list参数的构造,但不支持不定长参数的构造,比如std::vector和std::list。 std::vector vec={1,2,3,4,5};std::list lst={1,2,3,4,5}; ...
C++标准只规定了编译器可以帮我们把一个{}定义的常量数组转换为一个initializer_list对象,这样接受initializer_list为参数的函数(通常是各种构造函数),就可以接受{},通过这种方式扩展了语法,使我们可以像初始化普通数组那样初始化容器,简化了代码。 但不要把initializer_list当做一个普通的(容器)来用。 在GCC(4.8)的...
因为模板参数推导为initializer_list,而参数传递需要的是vector,使用这种方式还得手动创建一个临时的vector。 所以,具体问题具体分析,才能选择最恰当的方式,有时甚至可以组合使用。 大家也许注意到,开销对比图标题为"初始化Long String成员开销图",那么还有短String吗?