两个内容相同的unordered_set-s的迭代顺序是否保证相同

Is iteration order of two unordered_set-s with same contents guaranteed to be the same

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

PS。这个问题不同于 迭代相同的无序集两次。

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

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

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

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