我尝试使用std::random_shuffle,并收到编译错误。
我的编译器是v140(Visual Studio 2015),我使用x64,发布模式。
#include <random>
#include <algorithm>
void foo()
{
std::vector<int> v;
std::random_shuffle(v.begin(), v.end());
}
error C2039: 'random_shuffle': is not a member of 'std'
error C3861: 'random_shuffle': identifier not found
谢谢!
答案 0 :(得分:8)
使用toolchain v140的默认设置编译代码。但是,如果添加选项/std:c++latest
,则删除的标准库部分可能不再可用。
可能尝试尽可能接近C ++ 17。
答案 1 :(得分:5)
random_shuffle
在C ++ 14中已弃用,在C ++ 17中已完全删除。
您需要使用shuffle
,它将随机生成器作为参数。
您可以在网站上看到一个简单示例:
std::random_device rd; std::mt19937 g(rd()); std::shuffle(v.begin(), v.end(), g);
<强> n4190 强>
删除auto_ptr,random_shuffle()和Old Stuff
...
III。什么必须死?
D.12&#34;随机随机播放&#34; [depr.alg.random.shuffle]
这定义了random_shuffle(first,last)和random_shuffle(首先, 最后,rng)。 (后者采用RandomNumberGenerator,其中 要求与C ++ 11完全不同 UniformRandomNumberGenerator。)
random_shuffle(第一个,最后一个)的问题是它被允许 使用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 shuffle算法。它&#39; S 不是邪恶的,但它在实践中几乎无法使用,因为&#34; rng&#34; 函数对象需要提供一个非常奇怪的接口。 (它&#39; S 实际上需要在a上返回一个统一的整数分布 变化的间隔,如果不引入偏差就很难做到。) shuffle(first,last,urng)非常容易使用,因为它 直接消费URNG。
与gcc
或clang
不同,Visual Studio不提供选择标准版本的选项,因此弹出的问题是:哪个C ++标准会实现? 答案是......既不是......也不是每一个。最后我检查了他们的理念是他们努力慢慢地达到最新的标准版本,但不是标准版本的步骤,即他们正在实现C ++ 14功能,而C + 11还没有完全实现。因此,您将看到C ++ 11的某些部分已实现,C ++ 14的某些部分已实现,部分C ++ 17已实现。
答案 2 :(得分:0)
我在Visual Studio中遇到此错误。
要解决此问题,只需在/Zc:__cplusplus
中设置Properties > C/C++ > Command Line
标志就可以了。
尝试使用Hayai时遇到了这个问题。在Visual Studio中,__cplusplus
始终设置为199711L
,并且Hayai
也会由于以下原因而在Visual Studio中进行检查:
/// Randomly shuffles the order of tests.
static void ShuffleTests()
{
Benchmarker& instance = Instance();
#if __cplusplus > 201100L
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(instance._tests.begin(),
instance._tests.end(),
g);
#else
std::random_shuffle(instance._tests.begin(),
instance._tests.end());
#endif
}
正如您在Visual Studio中看到的那样,它总是分支到错误的代码段中,因此失败。
要解决此问题,只需在/Zc:__cplusplus
中设置Properties > C/C++ > Command Line
标志就可以了。
从Microsoft:
/Zc:__cplusplus
编译器选项启用__cplusplus 预处理程序宏,用于报告最新C ++语言的更新值 标准支持。默认情况下,Visual Studio始终返回该值__cplusplus
预处理程序宏为“ 199711L”。备注
__cplusplus
预处理程序宏通常用于报告支持 适用于特定版本的C ++标准。因为很多现有的 代码似乎取决于此匹配“ 199711L”的宏的值, 编译器不会更改宏的值,除非您 使用/Zc:__cplusplus
编译器选项显式选择加入。的 从Visual Studio 2017开始,/Zc:__cplusplus
选项可用 版本15.7,默认情况下处于关闭状态。在早期版本的Visual中 Studio,默认情况下,或者如果指定了/Zc:__cplusplus
-,则为Visual Studio为__cplusplus预处理器返回值“ 199711L” 宏。/permissive
-选项不会启用/Zc:__cplusplus
。启用
/Zc:__cplusplus
选项后,__cplusplus
宏取决于/std
版本开关的设置。下表显示了该宏的可能值:
请务必阅读实际的文章Here