'random_shuffle':不是'std'错误的成员

dro*_*rco 3 c++ std

我正在尝试使用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将随机生成器作为参数的。

您可以在网站上看到一个简单的示例:

std::random_device rd;
std::mt19937 g(rd());

std::shuffle(v.begin(), v.end(), g);
Run Code Online (Sandbox Code Playgroud)

n4190

删除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。


Visual Studio C ++标准版本。

gcc或相比clang,Visual Studio不提供选择标准版本的选项,因此弹出的问题是:VS实现哪种C ++标准?答案是……既不是……也不是每个。最后,我检查了他们的理念,即他们努力缓慢地获取最新的标准版本,而不是逐步进入标准版本,也就是说,他们正在实现C ++ 14功能,而C + 11尚未完全实现。因此,您将看到实现了C ++ 11的某些部分,实现了C ++ 14的某些部分以及实现了C ++ 17的某些部分。

  • 那不是std :: random_shuffle的例子,他得到的编译错误与传递错误数量的参数不一致。 (4认同)
  • 这个答案根本解决不了这个问题。 (2认同)
  • @Galik问:“我收到错误:'random_shuffle':不是'std'的成员” A:“`random_shuffle`已被删除”那怎么不回答问题? (2认同)
  • @Galik这与`c ++ 17`有什么关系?事实1:OP在Visual Studio中出现有关“ std”中未找到的函数的错误。事实2:所述功能在“ C ++ 17”中已删除。事实3:Visual Studio正在实现C ++ 17的功能。 (2认同)

Bo *_*son 8

该代码可以使用toolchain v140的默认设置进行编译.但是,如果添加该选项/std:c++latest,则删除的标准库部分可能不再可用.

可能是尝试尽可能接近C++ 17.