我正在尝试使用std :: random_shuffle,并获得编译错误.
我的编译器是v140(Visual Studio 2015),我在x64,Release模式下工作.
#include <random>
#include <algorithm>
void foo()
{
std::vector<int> v;
std::random_shuffle(v.begin(), v.end());
}
Run Code Online (Sandbox Code Playgroud)
error C2039: 'random_shuffle': is not a member of 'std'
error C3861: 'random_shuffle': identifier not found
Run Code Online (Sandbox Code Playgroud)
谢谢!
bol*_*lov 11
random_shuffle 在C ++ 14中已弃用,在C ++ 17中已完全删除。
您需要使用shuffle将随机生成器作为参数的。
您可以在网站上看到一个简单的示例:
Run Code Online (Sandbox Code Playgroud)std::random_device rd; std::mt19937 g(rd()); std::shuffle(v.begin(), v.end(), g);
删除auto_ptr,random_shuffle()和旧内容
...
三,必死之物
D.12“随机洗牌” [depr.alg.random.shuffle]
这定义了random_shuffle(first,last)和random_shuffle(first,last,rng)。(后者采用了RandomNumberGenerator,其要求与C ++ 11的UniformRandomNumberGenerator完全不同。)
random_shuffle(first,last)的问题是允许使用rand(),这是低质量的。(尽管我不知道有任何实现可以将rand()引入26.8 [c.math] / 5的数据竞争。)构造mt19937 urng并调用shuffle(first,last,urng)是一个优越得多的选择。与random_shuffle(first,last)不同,调用shuffle(first,last,urng)要求用户知道URNG的存在和状态,但是我认为这是一个功能,而不是错误。
random_shuffle(first,last,rng)是Knuth随机播放算法。这不是邪恶的,但是在实践中几乎是不可用的,因为需要“ rng”函数对象提供非常奇怪的接口。(实际上需要在可变的间隔上返回均匀的整数分布,这很难在不引入偏差的情况下完成。)shuffle(first,last,urng)易于使用,因为它直接消耗了URNG。
与gcc或相比clang,Visual Studio不提供选择标准版本的选项,因此弹出的问题是:VS实现哪种C ++标准?答案是……既不是……也不是每个。最后,我检查了他们的理念,即他们努力缓慢地获取最新的标准版本,而不是逐步进入标准版本,也就是说,他们正在实现C ++ 14功能,而C + 11尚未完全实现。因此,您将看到实现了C ++ 11的某些部分,实现了C ++ 14的某些部分以及实现了C ++ 17的某些部分。
该代码可以使用toolchain v140的默认设置进行编译.但是,如果添加该选项/std:c++latest,则删除的标准库部分可能不再可用.
可能是尝试尽可能接近C++ 17.
| 归档时间: |
|
| 查看次数: |
3819 次 |
| 最近记录: |