![](/img/trans.png)
[英]Is boost::random::discrete_distribution dynamically resizable?
[英]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库吗?
这是正常和无效代码的两个粘贴框:
另外,这行在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_list
是C ++ 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.