我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:六合公式 > 仿函数 >

为什么c++14把random_shuffle标为deprecated

归档日期:07-02       文本归类:仿函数      文章编辑:爱尚语录

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  前者使用编译器指定的随机数发生器来打乱数组的内容,这个随机数发生器通常是rand函数,它被deprecated的原因也和rand函数有关。由于rand函数是C语言的遗留产物,不同编译器实现方法不一样,产生随机数的可靠性也千差万别,并且C++11提供了一整套明确规定了算法的随机数发生器(位于random头文件)。有人提议把rand函数标为deprecated,来让更多的人使用C++11提供的“更好的东西”。使用rand函数的random_shuffle也被连带标为deprecated。

  后者要求rnd仿函数(只能是仿函数)产生的随机数的范围就是数组的下标范围,这样的仿函数通常不是很容易写,完全可以被更好的东西代替——这个更好的东西就是shuffle函数

  shuffle函数与random_shuffle的第二种形式相似,同样是接受一个仿函数,但对随机数的范围要求更松,因而可以直接传一个std::mt19997对象,或者std::random_device对象(都是C++11直接提供的随机数发生器)的进去,更便于使用,同时不像rand一样,不能保证打乱结果的可靠性

  因为rand被deprecated,使用它的random_shuffle自然也被deprecated注意random_shuffle有两个重载版本,只有一个被deprecated我曾经写的个求数独的程序靠random_shuffle提升了n倍的性能看N3936的§D.12[depr.alg.random.shuffle]似乎是说两个函数模板都是deprecated……std::random_shuffle的两个重载形式都是deprecated,但std::shuffle不是……虽然std::shuffle(v.begin(), v.end(), std::random_device())还是可以打乱列表的内容,不过似乎需要打更多字……

本文链接:http://renfriends.com/fanghanshu/677.html