C++ 有效提高分发使用率
重新措辞这个问题 我正在为boost normal distribution创建一个包装器类,并希望使其尽可能高效 如果我使用:C++ 有效提高分发使用率,c++,boost,distribution,C++,Boost,Distribution,重新措辞这个问题 我正在为boost normal distribution创建一个包装器类,并希望使其尽可能高效 如果我使用: 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(); } 但在这
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();
}
但在这种情况下,我得到一个错误,说var_或ie。没有参数是找不到的。
有谁能告诉我这些升压声明是怎么回事吗
boost:变量_生成等
行实际上与var_nor一致吗?
用我有限的C++知识,ValuNOR看起来是用两个不同的签名定义的。
谢谢各位
Pete在代码中,var_nor是一个变量,不是一个函数,因此它没有签名。它表示一个variate_生成器对象,该对象的行为类似于函数,因为它支持运算符
在代码中,您可以同时声明和初始化var_nor。rng和nd参数被传递给variate_生成器对象的构造函数
当您将声明移动到类的构造函数中时,您正在将var_nor声明为构造函数中的局部变量,因此它在其他地方不可用也就不足为奇了。要使某些内容在整个类中都可用,它必须是一个成员变量。在类中声明它为private:
class NormalDistribution
{
boost::random::mt19937 _rng;
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
public:
NormalDistribution();
};
然后在构造函数中初始化它:
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor(rng, nd);
NormalDistribution::NormalDistribution():
_rng(), var_nor(_rng, boost::normal_distribution<>(0.0, 1.0))
{ }
需要首先声明_rng成员,以便首先初始化它。nd参数可以省略,并替换为直接传递给var\u nor构造函数的临时正态分布对象,如上所示
通过这些更改,您应该能够在对示例函数的多次调用中使用同一个正态分布对象,或者对正态分布类的任何其他用途
在您从问题中删除的代码中,您混淆了变量声明和函数声明。您将nd声明为接收两个参数并返回正态分布的函数。var_nor也是如此。当你真的想要一个对象时,它是一个函数。您感到困惑,因为它恰好是一个作用类似于函数的对象,但它仍然只是一个对象。在您的代码中,var\u nor是一个变量,不是函数,因此它没有签名。它表示一个variate_生成器对象,该对象的行为类似于函数,因为它支持运算符
在代码中,您可以同时声明和初始化var_nor。rng和nd参数被传递给variate_生成器对象的构造函数
当您将声明移动到类的构造函数中时,您正在将var_nor声明为构造函数中的局部变量,因此它在其他地方不可用也就不足为奇了。要使某些内容在整个类中都可用,它必须是一个成员变量。在类中声明它为private:
class NormalDistribution
{
boost::random::mt19937 _rng;
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
public:
NormalDistribution();
};
然后在构造函数中初始化它:
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor(rng, nd);
NormalDistribution::NormalDistribution():
_rng(), var_nor(_rng, boost::normal_distribution<>(0.0, 1.0))
{ }
需要首先声明_rng成员,以便首先初始化它。nd参数可以省略,并替换为直接传递给var\u nor构造函数的临时正态分布对象,如上所示
通过这些更改,您应该能够在对示例函数的多次调用中使用同一个正态分布对象,或者对正态分布类的任何其他用途
在您从问题中删除的代码中,您混淆了变量声明和函数声明。您将nd声明为接收两个参数并返回正态分布的函数。var_nor也是如此。当你真的想要一个对象时,它是一个函数。您感到困惑,因为它恰好是一个作用类似于函数的对象,但它仍然只是一个对象。好的,使用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;
}
好的,使用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;
}
构造函数很奇怪:它定义了一些完全无用的局部变量,并且无法初始化任何类成员。也许是时候编写一本C++的好的书了?构造函数是奇怪的:它定义了一些完全无用的局部变量,并且不能初始化任何类成员。也许是时候写一本关于C++的好书了?谢谢你,Rob,把它清理一下。我没能认出超载的车。谢谢你,罗布,这就搞定了。我错过了超载的识别。我看不到rng和var_的理由,也看不到公开的理由。我看不到rng和var_的理由,也看不到公开的理由。