在没有复制构造函数的情况下实例化 std::vector 的唯一元素
instantiating unique elements of std::vector without a copy constructor
假设我有一个 std::vector
,我有一个 class。我想初始化这个向量的所有元素,但是对于这些元素中的每一个,class 的构造函数都将采用唯一的参数。
我是否需要为 class 提供一个复制构造函数,或者是否有一些奇怪的语法可以在不使用等号的情况下实例化 std::vector
的元素?
您可以直接使用 emplacement 操作在向量中创建新元素。
例如:
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
),也与安置。一旦插入,节点将永远不会移动。
假设我有一个 std::vector
,我有一个 class。我想初始化这个向量的所有元素,但是对于这些元素中的每一个,class 的构造函数都将采用唯一的参数。
我是否需要为 class 提供一个复制构造函数,或者是否有一些奇怪的语法可以在不使用等号的情况下实例化 std::vector
的元素?
您可以直接使用 emplacement 操作在向量中创建新元素。
例如:
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
),也与安置。一旦插入,节点将永远不会移动。