繁体   English   中英

在VC2010中初始化boost :: random :: discrete_distribution

[英]Initializing boost::random::discrete_distribution in VC2010

我正在尝试使用本机库(TR1)在Visual Studio 2010 SP1中实现boost :: random文档中的第一个示例。

在使用该库之前,我发现我只能使用内置的VC2010随机函数,它们的功能与Boost函数相同,但是在这里,我无法使用本机函数。

问题在于在VC2010中初始化discrete_distribution<> 在Boost中,它需要一个数组:

double probabilities[] =
{
    0.5, 0.1, 0.1, 0.1, 0.1, 0.1
};
boost::random::discrete_distribution<> dist( probabilities );

但是在VC2010中,我不知道该为它提供什么。 这是我在编译时收到的错误:

原因:无法从“ double [6]”转换为“ const std :: tr1 :: discrete_distribution <> :: param_type”

没有构造函数可以采用源类型,或者构造函数重载解析度不明确

我以为,由于这些功能是在VC2010中实现的,因此可以在保留多平台兼容性的同时使用内置功能,但似乎我不得不依靠boost类。

使用boost :: random超过VC2010中的内置类是否会对性能造成任何影响?

即使现在大多数C ++编译器都实现了Boost库,通常还是建议坚持使用Boost库吗?

这是正常和无效代码的两个粘贴框:

使用std的非工作修改示例

使用boost :: random的原始示例

另外,这行在boost doc页面上意味着什么?

提示:如果您的编译器支持std :: initializer_list,则可以直接使用权重来初始化discrete_distribution。

VC2010的std::tr1::discrete_distribution不符合最新的C ++ 11规范(因此,其名称空间为tr1 ),并且尚未提供构造它的所有方法。 实际上,似乎在VC2010中构造它的唯一方法是通过默认初始化它,或者提供一个被调用N次的生成器: http : //msdn.microsoft.com/zh-cn/library /ee462277.aspx

采用const param_type&的构造const param_type&本质上是同一件事: http : //msdn.microsoft.com/zh-cn/library/ee462364.aspx

在实际的C ++ 11规范中, discrete_distribution的构造函数还有两个重载,一个重载有两个输入迭代器,一个重载了std::initializer_list ,这使我们想到了第二个问题。

提示:如果您的编译器支持std :: initializer_list,则可以直接使用权重来初始化discrete_distribution。

std::initializer_listC ++ 11的一项新功能 ,它基本上使您不仅可以使用构造函数列表初始化数组和POD结构,还可以通过使构造函数采用std::initializer_list更复杂的类类型(它们也可以是用于初始化目的之外的其他目的)。 Wikipedia条目提供了更多信息,该想法非常简单明了,因此在此不再赘述。 但是从根本上讲,这意味着不要这样做:

double probabilities[] =
{
    0.5, 0.1, 0.1, 0.1, 0.1, 0.1
};
boost::random::discrete_distribution<> dist( probabilities );

您可以这样做:

boost::random::discrete_distribution<> dist( {0.5, 0.1, 0.1, 0.1, 0.1, 0.1} );

构造函数参数列表中的构造构造一个std::initializer_list<double> ,然后将其传递给boost::random::discrete_distribution<>构造函数。

VC2010尚不支持此功能的原因仅是因为VC2010尚不支持std::initializer_list (它仅部分支持C ++ 11)。

综上所述,VC2010的std::tr1::discrete_distribution的当前实现似乎非常缺乏,并且初始化它的唯一方法似乎是通过生成器函数,所以我自己坚持使用boost版本。

即使假设您使用的是完全符合C ++ 11规范的编译器,Boost仍然可以提供很多功能 C ++ 11绝对不能提供boost必须提供的一切,并且在使用C ++ 11时没有理由完全放弃boost。 但是,如果您正在编写C ++ 11代码,则显然可以使用它在boost版本上提供的功能的C ++ 11等效项,因为它们可能具有特定于供应商的优化。

许多人仍然选择C ++ 03而不是C ++ 11,因为要到所有主要的编译器制造商完全支持C ++ 11尚需时日,所以在这种情况下,C的功能就相当于C的功能了。 ++ 11还为您提供了相当有用的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM