假设我想构造一个固定大小的std :: vector对象,该对象没有移动或复制构造函数,例如std :: atomic。 在这种情况下,底层的std :: atomic类具有一个接受int类型的参数的1个参数构造函数,以及一个默认构造函数(它将值初始化为0)。
使用initializer_list语法,例如std :: vector > v {1,2,3}是行不通的,因为在创建initializer_list时,参数首先转换为向量的元素类型T,因此将调用复制或移动构造函数。
对于std :: atomic 的特殊情况,我可以默认构造向量,然后在其后改变元素。
使用initializer_list语法,例如std :: vector > v {1,2,3}是行不通的,因为在创建initializer_list时,参数首先转换为向量的元素类型T,因此将调用复制或移动构造函数。
对于std :: atomic 的特殊情况,我可以默认构造向量,然后在其后改变元素。
std::vector<std::atomic<int>> v(3);
v[0] = 1;
v[1] = 2;
v[2] = 3;
然而,除了不美观且效率低下外,它并不是一个通用的解决方案,因为许多对象可能没有提供与调用适当的构造函数等效的后构建突变。
有没有办法在向量构造时获得我想要的"emplace-like"行为?
std::deque
。但如果你不能用,想实现你想要的唯一方法是通过自定义分配器。 - Brian Bistd::deque
允许这种构造习惯用法吗? - BeeOnRopestd::deque
时,您需要逐个插入元素,但这是可行的,因为在开头或结尾添加元素不会移动任何其他元素。 - Brian Bistd::vector
更好,但不幸的是有时我需要vector
提供的连续存储的保证。我也对自定义分配器方法感兴趣:对我来说,自定义分配器如何解决vector
构造函数接口并不明显。 - BeeOnRope