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

Dan*_*iel 2 c++ unordered-set

假设我有一个unordered_set<int> S.

我知道我可以通过以下方式迭代:

void iterate(){
    for (const auto& elem: S) {
        cout<<elem<<endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果我打电话iterate()并打印出一定数量的数字,是否可以保证如果我iterate()按照我想要的次数打电话,它会一直打印相同的序列?

T.C*_*.C. 6

是的,只要S不修改.[container.requirements.general] P6:

begin() 返回一个迭代器,引用容器中的第一个元素.

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

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

剩下的就是[forward.iterators]中的前向迭代器要求,特别是:

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

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