C ++ unordered_set的迭代器begin()是否始终指向同一元素

时间:2019-07-13 02:06:57

标签: c++

由于unordered_set<int> nums不对元素进行排序,因此*nums.begin()总是一样吗?还是当我们再次访问它时(有时很少)它会改变?

1 个答案:

答案 0 :(得分:6)

对于每个突变(插入,删除)后的顺序,我们无法保证。但是顺序对于给定的内部状态是一致的。因此,重复调用begin()将返回相同的元素,直到您修改容器为止。之后,begin()可以返回任何元素。

unordered_set<T>类是这样实现的:

  

在内部,这些元素不是按照任何特定顺序排序的,而是按桶进行组织。元素放入哪个存储桶完全取决于其值的哈希值。这样一来,就可以快速访问各个元素,因为一旦计算出哈希值,它就指向该元素所放置的确切存储桶。

因此begin()返回的第一个元素将取决于容器中其他元素的哈希值,因为哈希值决定了将它们分配到哪个存储桶。因此,每次修改容器时,“第一”元素(实际上是迭代顺序)可能会更改。但是在突变之间,元素的哈希值不会改变,因此排序将一致