“random_shuffle”:不是“std”错误的成员

新手上路,请多包涵

我正在尝试使用 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

  • 知道问题可能是什么吗?

谢谢!

原文由 ibezito 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.7k
2 个回答

该代码使用工具链 v140 的默认设置编译良好。但是,如果您添加选项 /std:c++latest ,标准库的已删除部分可能不再可用。

可能是为了尽可能接近 C++17。

原文由 Bo Persson 发布,翻译遵循 CC BY-SA 4.0 许可协议

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() 和旧的东西

三、什么必须死

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 shuffle 算法。它并不邪恶,但在实践中几乎无法使用,因为“rng”函数对象需要提供一个非常奇怪的接口。 (实际上需要在不同的时间间隔内返回一个均匀的整数分布,这在不引入偏差的情况下很难做到。) shuffle(first, last, urng) 非常容易使用,因为它直接消耗 URNG。


Visual Studio C++ 标准版。

gccclang 不同,Visual Studio 不提供选择标准版本的选项,因此弹出的问题是: VS 实现了哪个 C++ 标准? 答案是……两者都没有……而且每个都有一点。最后我检查了他们的理念是他们努力慢慢达到最新的标准版本,但不是在标准版本的步骤中,即他们正在实现 C++14 功能,而 C+11 还没有完全实现。因此,您将看到 C++11 的某些部分已实现,C++14 的某些部分已实现,C++17 的某些部分已实现。

原文由 bolov 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏