std::unordered_multiset::find函数是否返回具有相同哈希值的两个值之间的第一个插入元素



假设我们有两个值映射相同哈希值的std::unordered_multiset,c++标准是否保证find将返回第一个插入的元素?

有趣的问题。我没有经常使用无序的关联容器,所以我抓住机会搜索了标准。以下是我的解释:23.2.5.6表示

"在支持等效键的容器中,具有等效键的元素键按的迭代顺序彼此相邻容器因此,尽管未指定无序容器,其元素被分组到等效密钥组,使得每个组的所有元素都具有等效密钥。">

但随后继续

"对无序容器的突变操作应保留每个等价密钥组中元素的相对顺序,除非另有规定。">

23.2.5.9然后说明

"对于无序多重集和无序多重映射,重新哈希保留等价元素的相对排序。">

因此,这个顺序似乎被保留了下来,因为insert并没有说它可能会改变等价键的顺序。但是,find被指定为

"返回一个迭代器,该迭代器指向键等于k的元素,或者b.end((,如果不存在这样的元素。">

因此,它不会定义它返回的等价键的哪个元素。严格地说,这可以返回具有给定密钥的随机元素,并且仍然满足规范。假定equal_range定义为

返回一个包含所有元素的范围,这些元素的键等于k。

*equal_range(k).first可以完成这项工作并返回用密钥k插入的第一个元素。

我假设您的问题是关于两个键,它们不仅生成相同的哈希值,而且还使用提供给unordered_multiset的相等谓词来比较相等。unordered_multiset::find将仅使用哈希值来初始定位要在其中搜索的bucket,但之后将使用相等谓词进行搜索。

§23.2.5 [unord.req]表103—无订单关联容器要求

b.find(k)

返回一个迭代器,该迭代器指向具有与CCD_,或者CCD_ 7(如果不存在这样的元件(。

unordered_multi*容器没有对find()提出额外要求。这意味着实现不需要unordered_multiset::find向第一个插入的元素返回迭代器。但话说回来,如果这两个(或更多(键真的相等,你为什么会在乎呢?

最新更新