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

时间:2014-03-14 17:42:45

标签: c++ unordered-set unordered-multiset

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

2 个答案:

答案 0 :(得分:3)

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

  

"在支持等效键的容器中,具有等效键的元素   密钥以迭代顺序彼此相邻   容器。因此,虽然元素的绝对顺序在   未指定无序容器,其元素被分组   等效键组,使得每个组的所有元素都具有   等价键。"

但接着继续

  

"对无序容器进行变异操作应保留   除非,每个等效键组内元素的相对顺序   否则指定。"

23.2.5.9然后陈述

  

"对于unordered_multiset和unordered_multimap,rehashing preserves   等价元素的相对排序。"

所以顺序似乎被保留了,因为insert并没有说它可能会改变等效键的顺序。但是,find被指定为

  

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

因此,它没有定义它返回的等效键的哪个元素。严格来说,这可能会返回带有给定键的随机元素,并且仍然符合规范。鉴于equal_range被定义为

  

返回一个范围,其中包含所有具有等于k的键的元素。

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

答案 1 :(得分:1)

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

  

§23.2.5 [unord.req] 表103 - 无序关联容器要求

     

b.find(k)

     

返回一个指向具有等效于k的键的元素的迭代器,   如果不存在这样的元素,则为b.end()

find()容器上没有unordered_multi*的额外要求。这意味着unordered_multiset::find不需要实现将迭代器返回到第一个插入元素。但话说回来,如果两个(或更多)键真的相同,你为什么要关心?