gpt4 book ai didi

c++ - 高效的 boost 分配使用

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:51 25 4
gpt4 key购买 nike

(改写问题)

我正在为 boost 正态分布创建一个包装器类,并希望使其尽可能高效。

如果我使用:

double x = 0.0;
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor(rng, nd);
for (int i=0; i<20; i++) {
double x = var_nor();
}

循环工作正常。我担心的是,我不想在多次调用该方法时不必要地声明任何内容。我尝试拆分代码并将这一行放在构造函数中:

boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor(rng, nd);

并有一个执行此操作的示例方法:

     double x = var_nor();
return x;

但在这种情况下,我收到一条错误消息,提示未找到 var_nor()(即没有参数)。谁能告诉我这些 boost 声明是怎么回事,即。什么是

boost:variate_generate etc.

行实际上是用var_nor做的吗?以我有限的 C++ 知识,看起来好像 var_nor 是用两个不同的签名定义的。

谢谢大家皮特

最佳答案

在您的代码中,var_nor 是一个变量,而不是函数,因此它没有签名。它表示一个variate_generator 对象,该对象表现得像一个函数,因为它支持operator()

在您的代码中,您同时声明和初始化var_norrngnd 参数被传递给 variate_generator 对象的构造函数

当您将声明移动到类的构造函数中时,您是在构造函数中将 var_nor 声明为一个局部变量,因此它在其他地方不可用也就不足为奇了。对于在整个类中可用的东西,它需要是一个成员变量。在类中将其声明为私有(private):

class NormalDistribution
{
boost::random::mt19937 _rng;
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
public:
NormalDistribution();
};

然后在构造函数中初始化:

NormalDistribution::NormalDistribution():
_rng(), var_nor(_rng, boost::normal_distribution<>(0.0, 1.0))
{ }

需要先声明_rng成员,这样才会先初始化。 nd 参数可以省略并替换为直接传递给 var_nor 构造函数的临时 normal_distribution 对象,如上所示。

通过这些更改,您应该能够在对 sample 函数的多次调用中使用相同的 normal_distribution 对象,或者您对 的任何其他用途NormalDistribution 类。

在您从问题中删除的代码中,您混淆了变量声明和函数声明。您将 nd 声明为接收两个参数并返回 normal_distribution 的函数。与 var_nor 类似。当你真的想要一个对象时,它就是一个函数。你很困惑,因为它恰好是一个像函数一样工作的对象,但它仍然只是一个对象。

关于c++ - 高效的 boost 分配使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10831003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com