我正在尝试使用本机库(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。
答案 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为您提供的设施仍然非常有用。