初始化VC2010中的boost::random::discrete_distribution
Initializing boost::random::discrete_distribution in VC2010
我正在尝试在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仍然非常有用。
- 没有找到相关文章