实例化 std::vector 的唯一元素,而无需复制构造函数

instantiating unique elements of std::vector without a copy constructor

本文关键字:复制 构造函数 元素 std vector 唯一 实例化      更新时间:2023-10-16

假设我有一个std::vector,我有一个类。我想初始化这个向量的所有元素,但对于这些元素中的每一个,类的构造函数将采用唯一的参数。

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

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

例如:

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_back 就像 push_back 一样,但直接创建对象(即使使用显式构造函数(。请注意,您的X仍然需要可复制或可移动,因为回推新元素需要重新分配,这需要复制或移动。(此外,在中间插入需要可分配性。不可移动的元素(例如 std::mutex (只能进入基于节点的容器(例如 std::list (,也带有安置。一旦插入,节点永远不会移动。