c++ - 初始化 vector 的高效而优雅的方法

标签 c++ c++14 move initializer-list

给定以下 C++14 代码:

struct A { /* heavy class, copyable and movable */ };

// complex code to create an A
A f(int);
A g(int);
A h(int);

const std::vector<A> v = { f(1), g(2), h(3) };

我知道 A initializer_list 中的 被复制到 vector 中,而不是被 move (stackoverflow 中有很多关于此的问题)。

我的问题是:如何将它们 move 到 vector 中?

我只能做丑陋的 IIFE(保留 v 常量)并且只是避免了 initializer_list:

const std::vector<A> v = []()
{
    std::vector<A> tmp;
    tmp.reserve(3);
    tmp.push_back( f(1) );
    tmp.push_back( g(2) );
    tmp.push_back( h(3) );
    return tmp;
}();

是否有可能使这种优雅的变得高效?

PD:v 必须std::vector<A>以备后用

最佳答案

不确定它是否算作“优雅”,但您可以使用一个数组(或 std::array),它使用不会遇到此问题的聚合初始化和 move_iterator 将值 move 到 vector 中。

std::array<A, 3> init = { f(1), g(2), h(3) };

std::vector<A> v{std::make_move_iterator(init.begin()), 
                 std::make_move_iterator(init.end())};

Live demo .

关于c++ - 初始化 vector 的高效而优雅的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43677016/

相关文章:

c++ - Visual Studio 调试器失败但程序在构建时运行正常...?

C++/boost : Undefined Symbols in example?

c++ - 动态推断函数的返回类型

c++ - std::transform 包装器,带有指向成员函数和 back_inserter 的指针

C++ move 语义(和右值引用)与普通引用

C++ move () : what's left in the vector?

C++ 删除字符串上的标点符号,erase()/iterator 问题

c++ - C++中特殊数组的问题

C++14:返回 {} 时元组中的默认值

java - 在适用于 Android 的 Java 中 move 对象/位图