假设我有一个unordered_set<int> S
。
我知道我可以使用以下方法遍历S:
void iterate(){
for (const auto& elem: S) {
cout<<elem<<endl;
}
}
我的问题是:如果我呼叫iterate()
并且打印出一定的数字序列,是否可以保证如果我多次调用iterate()
,它将始终打印出相同的序列?
答案 0 :(得分:6)
是的,只要未修改S
。 [container.requirements.general] p6:
begin()
返回引用容器中第一个元素的迭代器。
使用定冠词“ the”意味着只有一个这样的“第一个元素”。因此,对同一(未更改)容器上的begin()
的多次调用必须返回引用相同元素的迭代器。
此外,所有容器迭代器都必须至少是正向迭代器(请参见同一小节中的表64)。
其余的都不符合[forward.iterators]中的转发迭代器要求,尤其是:
由于从相等的迭代器开始,迭代的每一步都必须产生相等的迭代器,这些迭代器必须引用容器中的相同元素。
答案 1 :(得分:2)
假设您不更改集合的内容,则在迭代过程中将获得相同顺序的元素。
这是因为迭代是确定性的。如果集合的内部结构无故更改,则迭代器将失效。
答案 2 :(得分:-1)
我发现了一个句子,“请注意,unordered_set对象不能保证将哪个特定元素视为其第一个元素”。在 this网站,我相信这可以帮助您解决问题。