首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一种高效优雅的矢量初始化方法

一种高效优雅的矢量初始化方法
EN

Stack Overflow用户
提问于 2017-04-28 09:40:41
回答 2查看 2.2K关注 0票数 6

给定以下C++14代码:

代码语言:javascript
运行
复制
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中被复制到向量中,而不是被移动(在堆栈溢出中有很多问题)。

我的问题是:我如何将它们移动到向量中?

我只做了丑陋的生活(保持了v康斯特),并避免了initializer_list:

代码语言:javascript
运行
复制
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>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-28 10:27:29

不确定它是否“优雅”,但您可以使用一个数组(或std::array),它使用不受此问题影响的聚合初始化,并使用move_iterator将值移动到vector中。

代码语言:javascript
运行
复制
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())};

现场演示

票数 7
EN

Stack Overflow用户

发布于 2017-04-28 11:46:39

您需要一个C++14解决方案,这样就可以使用带有auto参数的变量lambda函数。

遵循lambda函数的例子..。

代码语言:javascript
运行
复制
#include <vector>

struct A
 { };

A f (int) { return {}; } 
A g (int) { return {}; } 
A h (int) { return {}; } 


int main ()
 {
   static const auto getVA = [](auto && ... args)
    {
      using unused = int[];

      std::vector<A> ret;

      ret.reserve(sizeof...(args));

      (void)unused { 0,
            (ret.emplace_back(std::forward<decltype(args)>(args)), 0)... };

      return ret;
    };

   auto va = getVA(f(1), g(2), h(3));
 }

如果您喜欢旧类型(非-lambda)函数,或者您想要一个同样适用于C++11的解决方案,则可以编写如下getVA

代码语言:javascript
运行
复制
template <typename ... Args>
std::vector<A> const getVA (Args&& ... args)
 {
   using unused = int[];

   std::vector<A> ret;

   ret.reserve(sizeof...(args));

   (void)unused { 0, (ret.emplace_back(std::forward<Args>(args)), 0)... };

   return ret;
 }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43677016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档