给定以下 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())};
关于c++ - 初始化 vector 的高效而优雅的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43677016/