【问题标题】:Is iteration order of two unordered_set-s with same contents guaranteed to be the same两个具有相同内容的 unordered_set-s 的迭代顺序是否保证相同
【发布时间】:2021-10-21 09:02:41
【问题描述】:

如果我有两个 unordered_set 变量具有相同的内容(如果已排序),但创建方式不同(例如,第一个变量只插入了项目,第二个变量以不同的顺序插入、删除了项目等,但两个变量都结束了相同的内容),迭代这两个变量是否会以相同的顺序产生值?

PS。这个问题不同于similar questions on 重复相同的无序集两次。

【问题讨论】:

  • AFAIK,对此没有任何保证。我会假设你很有可能他们不一样。我观察到插入顺序会改变迭代顺序。
  • 它可能在名称中...unordered,无论你做什么最终得到相同的内容,它们在迭代后可能不会以相同的顺序出现

标签: c++ c++11 language-lawyer unordered-map unordered-set


【解决方案1】:

标准不作这样的保证。排序必然是特定于实现的。

考虑这个例子,看看为什么即使内容相同,排序也可能不同:让我们从两个无序集合 AB 开始,它们已创建并以相同的顺序填充值,直到再添加一个对象会触发重新散列。

现在考虑将对象添加到B,然后将其删除,而不向A 添加任何对象时会发生什么。显然,这两个集合是相同的,但是由于 B 经历了重新散列,这些集合中的对象的顺序会发生变化。

C++11 standard 的第 23.2.5.12 节讨论了无序容器的相等性。它指出,找出等式的最坏情况时间复杂度是 O(n^2)。这意味着不能保证相同的顺序,否则我们将能够检查 O(n) 中的相等性。

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 2012-04-09
    • 2019-03-17
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多