说我有一个std::vector
,我有一个班级。我想初始化此向量的所有元素,但对于每个元素,类的构造函数将采用唯一的参数。
我是否需要为类提供一个复制构造函数,或者是否有一些奇怪的语法,我可以在不使用等号的情况下实例化std::vector
的元素?
答案 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_back
与push_back
类似,但直接创建对象(甚至使用显式构造函数)。请注意,您的X
仍然需要是可复制的或可移动的,因为推回新元素需要重新分配,这需要复制或移动。 (中间的插入还需要可分配性。)不可移动的元素(例如std::mutex
)只能进入基于节点的容器(例如std::list
),也可以进入安置。插入后,节点永远不会移动。