高效的增强分配使用

时间:2012-05-31 09:35:16

标签: c++ boost distribution

(改述问题)

我正在为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:variate_generate等。

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

谢谢你们 皮特

2 个答案:

答案 0 :(得分:4)

在您的代码中,var_nor变量,而不是函数,因此它没有签名。它代表一个{em}行为<{1}}的{​​{1}}对象,因为它支持variate_generator

在您的代码中,您同时声明并初始化operator()var_norrng参数将传递给nd对象的构造函数

当您将声明移动到类的构造函数中时,您在构造函数中声明variate_generator局部变量,因此难怪它在其他地方不可用。对于整个班级中可用的内容,它必须是成员变量。在类中声明它是私有的:

var_nor

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

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构造函数的临时normal_distribution对象,如上所示。

通过这些更改,您应该可以使用相同的var_nor对象,而不是多次调用normal_distribution函数,或者对sample类使用其他任何用途。

在您从问题中删除的代码中,您将变量声明与函数声明混淆。您将NormalDistribution声明为接收两个参数并返回nd的函数。与normal_distribution同样如此。当你真的想要一个物体时,这是一个功能。您感到困惑,因为它碰巧是一个像函数一样的对象,但它仍然只是一个对象。

答案 1 :(得分:0)

好的,使用Rob Kennedy的答案,为其他可能感兴趣的人做最终版本:

// normaldistribution.h
#ifndef NORMALDISTRIBUTION_H
#define NORMALDISTRIBUTION_H

#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>
class NormalDistribution
{
 public:
    NormalDistribution();
    double sample(void);
 private:
    // Use the boost random number generator
    boost::mt19937 rng;
    // Make a variate_generator OBJECT.
    boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
};

#endif // NORMALDISTRIBUTION_H

// normaldistribution.cpp
NormalDistribution::NormalDistribution():
  rng(), var_nor(rng, boost::normal_distribution<>(0.0, 1.0))
{
    std::cout << "Called normal distribution constructor, passing up var_nor" << std::endl;
}

double NormalDistribution::sample(void) {
    double x = var_nor();
    return x;
}

// main.cpp
#include "normaldistribution.h"

int main(int argc, char *argv[])
{
    NormalDistribution *nd = new NormalDistribution();
    for (int i=0; i < 10; ++i)
    {
      double d = nd->sample();
      std::cout << d << std::endl;
    }
    return 0;
}