vuk*_*ung 2 c++ initializer-list c++11
比方说,我有一个结构
struct A {
A(int n) : n(n) {}
int n;
};
Run Code Online (Sandbox Code Playgroud)
我想std::vector用一些元素初始化一个.我可以通过使用初始化列表或通过安排新元素来完成此操作:
// 1st version: 3 ctors, 3 copy ctors, 3 dtors
std::vector<A> v1{1, 2, 3};
// 2nd version: 3 ctors
std::vector<A> v2;
v2.reserve(3);
v2.emplace_back(4);
v2.emplace_back(5);
v2.emplace_back(6);
Run Code Online (Sandbox Code Playgroud)
正如评论所示,第一个版本调用3个构造函数,3个复制构造函数和3个析构函数.带有emplace的版本仅使用3个构造函数.
问题:显然第二个版本更好,但第一个版本更简洁.我可以两全其美吗?我可以直接初始化而无需额外费用吗?
(这里有一个更长的版本中的A显示发生了什么结构.)
既然A是可转换的int,你可以使用范围构造函数vector:
auto inits = {1, 2, 3};
std::vector<A> v1{std::begin(inits), std::end(inits)};
Run Code Online (Sandbox Code Playgroud)
或者在单个声明语句中(假设您可以依赖RVO):
auto v1 = [inits={1, 2, 3}] { return std::vector<A>{std::begin(inits), std::end(inits)}; }();
Run Code Online (Sandbox Code Playgroud)