假设我们std::unordered_multiset
有两个值映射相同的哈希值,c ++标准是否保证find会返回第一个插入的元素?
答案 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
不需要实现将迭代器返回到第一个插入元素。但话说回来,如果两个(或更多)键真的相同,你为什么要关心?