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

时间:2011-10-25 06:25:34

标签: c++ visual-studio-2010 boost random tr1

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

在使用库之前,我发现我可以使用内置的VC2010随机函数,它们就像升级函数一样工作,但在这里我不能使用本机函数。

问题在于在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&lt;&gt; :: param_type'

     

没有构造函数可以获取源类型,或构造函数重载解析不明确

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

在VC2010中对内置类使用boost :: random 是否有性能损失?

一般建议坚持使用Boost库,即使它们现在已在大多数C ++编译器中实现了吗?

以下是工作代码和非工作代码的两个代码块:

Non-working modified example using std

Working original example using boost::random

此外,此行在boost doc page上的含义是什么?

  

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

1 个答案:

答案 0 :(得分:0)

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

采用const param_type&的构造函数基本上是相同的:http://msdn.microsoft.com/en-us/library/ee462364.aspx

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

  

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

std::initializer_list是一个new C++11 feature,它基本上允许您初始化带有初始化列表的数组和POD结构,但也可以通过让构造函数获取std::initializer_list来更复杂的类类型(除了初始化新对象之外,它们还可以用于其他目的。维基百科条目有更多的信息,这个想法非常简单,所以我不会在这里详细介绍。但基本上它意味着而不是做:

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版本。< / p>

即使假设您使用的编译器完全符合C ++ 11规范,Boost仍然可以提供 lot 。 C ++ 11绝不会提供一些提升你所能提供的功能,而且在使用C ++ 11时没有理由完全放弃提升。但是,如果您正在编写C ++ 11代码,那么使用它提供的C ++ 11等效设备显然比升级版本更有意义,因为它们可能具有供应商特定的优化。

许多人仍然选择C ++ 03而不是C ++ 11,因为在所有主要编译器制造商完全支持C ++ 11之前还需要一段时间,因此在这种情况下,相应的提升等价物C ++ 11为您提供的设施仍然非常有用。