【问题标题】:Iteration order of std::unordered_setstd::unordered_set 的迭代顺序
【发布时间】:2020-11-23 10:14:33
【问题描述】:

使用 std::unordered_set(或 std::unordered_map)的相同代码是否在两台不同的机器上运行并使用相同的确切 g++ 版本编译给出相同的迭代顺序?

相关但略有不同的问题


我在这里添加一些 cmets 以更好地解释我想要理解的内容。

是否足以修复编译器版本以获得相同的行为,在这种情况下,就迭代顺序而言?还是取决于其他一些东西?

感谢您指出该标准没有强加任何行为。但是,必须明确定义实施。最后,它是计算机代码,因此它是确定性和明确定义的。我想到的唯一选择是一些疯狂的实现可能会使用一些真正的随机源,但我认为这不太可能。

【问题讨论】:

  • unordered是一样的,不管是set还是map。
  • 很抱歉不得不问这个问题,但是:你为什么问这个问题?也就是说,为什么你(认为你)需要知道无序集合的迭代顺序?毕竟,它被称为“无序”是有原因的……另外,明天有人会更改 GCC 的版本。或者切换到clang++。或者月相改变。如果您的问题的答案发生变化怎么办?
  • @einpoklum 谢谢你的意见。我知道容器根据定义是无序的。但是,问题不在于标准,而在于实施。特别是,我有兴趣了解是否修复了一组工具(在这种情况下是给定的 g++ 版本),这些结构的实现是否依赖于 g++ 版本以外的其他东西。它是否取决于平台/架构?他们是否使用了一些随机化?否则我看不出迭代顺序有什么不同。
  • 在哈希映射中使用一点随机化一点也不疯狂。例如,在围棋中,地图是随机的,以击败基于密钥冲突的 DoS 攻击。想象一些未来的 stdlibc++ 版本实现类似的随机化并非不可能(尽管这可能会破坏相当多的现有代码,尤其是在单元测试中,因此不太可能发生)。还要注意 G++ 和 stdlibc++ 是不同的东西。您需要主要检查 stdlibc++ 版本以确保任何类型的兼容性。
  • 谢谢@rustyx,这可能就是我想要的。另外我想,即使是 Go 也使用某种可重现的随机化(某种伪随机引擎),而不是真正的随机化来源。

标签: c++ c++11 unordered-map libstdc++ unordered-set


【解决方案1】:

C++ 标准中没有任何内容表明它应该这样做。

g++ 似乎没有任何文档指定超出标准对该特定主题的要求。

我会说不,完全概括。

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 2016-07-14
    • 1970-01-01
    • 2017-09-09
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多