在没有复制构造函数的情况下实例化std :: vector的唯一元素

时间:2017-03-30 23:26:34

标签: c++ copy-constructor stdvector

说我有一个std::vector,我有一个班级。我想初始化此向量的所有元素,但对于每个元素,类的构造函数将采用唯一的参数。

我是否需要为类提供一个复制构造函数,或者是否有一些奇怪的语法,我可以在不使用等号的情况下实例化std::vector的元素?

1 个答案:

答案 0 :(得分:4)

您可以使用安置操作直接在矢量中创建新元素。

例如:

struct X { X(int, char); X(std::string, double, bool); };

std::vector<X> v;

v.emplace_back(1, 'x');              // direct-initializes element X(1, 'x')
v.emplace_back("foo", 1.5, false);   // ditto with element X("foo", 1.5, false)

基本上,emplace_backpush_back类似,但直接创建对象(甚至使用显式构造函数)。请注意,您的X仍然需要是可复制的或可移动的,因为推回新元素需要重新分配,这需要复制或移动。 (中间的插入还需要可分配性。)不可移动的元素(例如std::mutex)只能进入基于节点的容器(例如std::list),也可以进入安置。插入后,节点永远不会移动。