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

Initializing boost::random::discrete_distribution in VC2010

本文关键字:discrete distribution random 初始化 中的 boost VC2010      更新时间:2023-10-16

我正在尝试在Visual Studio 2010 SP1中使用本机库(TR1)实现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类。

在VC2010中使用boost::random是否有任何性能损失?

通常是建议坚持使用Boost库的想法,即使它们现在在大多数c++编译器中实现?

下面是工作和非工作代码的两个pastebin:

使用std

修改后的不工作示例

使用boost::random

的原始示例

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

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

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是c++ 11的一个新特性,它不仅允许您使用初始化列表初始化数组和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版本。

即使假设您正在使用完全符合c++ 11规范的编译器,Boost仍然有许多可以提供。c++ 11不可能提供boost必须提供的所有功能,并且在使用c++ 11时没有理由完全放弃boost。但是,如果您正在编写c++ 11代码,那么显然使用c++ 11提供的与boost版本相同的功能是有意义的,因为它们可能具有特定于供应商的优化。

许多人仍然选择c++ 03而不是c++ 11,因为距离所有主要编译器制造商完全支持c++ 11还需要一段时间,所以在这种情况下,c++ 11提供的等效功能的boost仍然非常有用。

相关文章:
  • 没有找到相关文章