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

时间:2018-11-14 00:16:40

标签: c++ unordered-set

假设我有一个unordered_set<int> S

我知道我可以使用以下方法遍历S:

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

我的问题是:如果我呼叫iterate()并且打印出一定的数字序列,是否可以保证如果我多次调用iterate(),它将始终打印出相同的序列?

3 个答案:

答案 0 :(得分:6)

是的,只要未修改S。 [container.requirements.general] p6:

  

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

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

此外,所有容器迭代器都必须至少是正向迭代器(请参见同一小节中的表64)。

其余的都不符合[forward.iterators]中的转发迭代器要求,尤其是:

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

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

答案 1 :(得分:2)

假设您不更改集合的内容,则在迭代过程中将获得相同顺序的元素。

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

答案 2 :(得分:-1)

我发现了一个句子,“请注意,unordered_set对象不能保证将哪个特定元素视为其第一个元素”。在 this网站,我相信这可以帮助您解决问题。