通过 unordered_set 的重复迭代是否会产生一致的结果?

Does repeated iteration through an unordered_set produce consistent results?

假设我有一个 unordered_set<int> S

我知道我可以通过以下方式遍历 S:

void iterate(){
    for (const auto& elem: S) {
        cout<<elem<<endl;
    }
}

我的问题是:如果我调用 iterate() 并打印出特定的数字序列,是否可以保证如果我多次调用 iterate(),它总是会打印出相同的序列?

如果你不改变集合的内容,你将在迭代过程中得到相同顺序的元素。

这是因为迭代是确定性的。如果集合的内部结构无故改变,迭代器就会失效。

可以,只要不修改S。 [container.requirements.general]p6:

begin() returns an iterator referring to the first element in the container.

使用定冠词 "the" 意味着只有一个这样的 "first element"。因此,在同一个(未更改的)容器上对 begin() 的多次调用必须 return 引用同一元素的迭代器。

此外,所有容器迭代器都必须至少是正向迭代器(参见同一子条款中的 Table 64)。

其余部分不符合 [forward.iterators] 中的前向迭代器要求,特别是:

  • 当且仅当取消引用的结果绑定到同一个对象时,两个可取消引用的迭代器比较相等;和
  • 递增两个相等的迭代器产生相等的迭代器。

由于您从相等的迭代器开始,迭代的每一步都必须产生相等的迭代器,它们必须引用容器中的相同元素。

我在 "Notice that an unordered_set object makes no guarantees on which specific element is considered its first element." 中找到了一个句子 this 网站 我相信这可以帮助你解决问题。