通过 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 网站 我相信这可以帮助你解决问题。
假设我有一个 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 网站 我相信这可以帮助你解决问题。