【问题标题】:How would you initialize a const vector of function results using C++11?您将如何使用 C++11 初始化函数结果的 const 向量?
【发布时间】:2013-02-19 15:23:43
【问题描述】:

是否可以使用generate_n 之类的东西来创建一个const vector,比如随机数?如果不派生vector 并在构造函数中进行赋值,我想不出办法。

【问题讨论】:

  • 我知道你现在有一个答案,但仅供参考,派生 vector(或 std 命名空间中的其他类型并非专门用于派生)是 risky

标签: c++ c++11 initialization constants


【解决方案1】:

如果您愿意,可以使用静态助手或 lambda;正如 cmets 中所指出的那样,移动语义/复制省略将使这非常便宜,因为所有体面的编译器都会省略助手返回的向量的完整副本。相反,他们只会创建代码来填充单个向量,然后使用该向量。

std::vector< int > Helper()
{
  const size_t n = 10;
  std::vector< int > x( n );
  std::generate_n( x.begin(), n, someGenerator );
  return x; 
}

const std::vector< int > my_const_vec( Helper() );

这里是 lambda 版本:

const std::vector< int > my_const_vec( [] ()
  {
    const size_t n = 10;
    std::vector< int > x( n );
    std::generate_n( x.begin(), n, someGenerator );
    return x; 
  }() );

【讨论】:

  • 有了这么简单的helper,大多数编译器甚至会完全省略副本。
  • 顺便说一下,根据 current 标准,我认为您的 lambda 需要一个 -&gt; std::vector&lt;int&gt;
  • 嗯,现在我很困惑。尝试使用 gcc4.7 和 cl17.00 并且他们都接受它,但实际上我似乎记得以前的版本都会拒绝它。
【解决方案2】:

将您的初始化封装到一个函数中并将其声明为“constexpr”,以便您可以使用它来初始化一个 const 表达式。

【讨论】:

  • 这里不需要constexpr,因为他不需要编译时常量表达式(无论如何,std::vector 返回永远不可能)。
【解决方案3】:

你也可以使用std::transform

vector<int> vec(10,1);
transform(vec.begin(), vec.end(), vec.begin(), func);

func 在哪里:

int func(int i)
{
//return a random generated number 
}

【讨论】:

  • 这是可能的,但 OP 要求单个 const 向量。
  • @stijn 哦,是的。但我可能会使用一个临时中间向量,然后将其分配给 const 向量,因为即使您的方法在被调用的函数中创建了一个。
猜你喜欢
  • 2012-12-08
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多