高效直接初始化std :: vector

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显示发生了什么结构.)

eca*_*mur 5

既然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)

  • @vukung它是因为vector只有一个`initializer_list`构造函数用于它的元素类型,而`initializer_list`s对于文字类型只是非常有效.转换`initializer_list <U>`构造函数只对从`U`转换的类型`T`有用,所以我猜他们没有打扰. (2认同)