假设我们有两个值映射相同哈希值的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
向第一个插入的元素返回迭代器。但话说回来,如果这两个(或更多(键真的相等,你为什么会在乎呢?