将equal_range用于unordered_map

时间:2018-11-28 13:44:11

标签: c++

从某种意义上来说,lower_bound中没有upper_boundstd::unordered_map,因为元素没有顺序。

然而,std::unordered_map具有方法equal_range。它返回对应于键的范围的迭代器。

这有什么意义?因为在std::unordered_map中只能有一个带键的元素。这只是find方法。

还在std::unordered_multimap中,它的存在是否意味着在使用迭代器迭代unordered_multimap时,具有相同键的所有元素将总是在一起吗?

4 个答案:

答案 0 :(得分:4)

  

这有什么意义?

有点。该标准要求所有关联容器都提供equal_range,因此非multi容器需要提供它。它确实使编写通用代码更加容易,所以我怀疑这就是为什么要求所有容器都使用它的原因。

  

它的存在是否意味着在使用迭代器迭代unordered_map时,具有相同键的所有元素总是会在一起吗?

实际上,是的。由于所有键都具有相同的值,因此它们将散列为相同的值,这意味着它们都存储在同一存储桶中,并且由于键比较相等而将它们分组在一起。来自[unord.req]/6

  

无序关联容器如果每个键最多可以包含一个元素,则它支持唯一键。否则,它支持等效键。 unordered_­set和unordered_­map支持唯一键。 unordered_­multiset和unordered_­multimap支持等效键。 在支持等效键的容器中,具有等效键的元素以容器的迭代顺序彼此相邻。因此,尽管未指定无序容器中元素的绝对顺序,但将其元素分组为等效键组,以使每组中的所有元素都具有等效键。对无序容器的突变操作应保留相对顺序除非另有说明,否则每个等效键组中元素的数量。

强调我的

答案 1 :(得分:3)

是为了与其他容器保持一致。

viewclass变体中更有意义,但是它存在于标准库中的所有关联(和无序关联)容器中。

它允许您编写类似的代码

_multi

哪个都不关心它在处理哪个特定的容器

答案 2 :(得分:2)

cplusplus.com撰写有关std::unordered_map::equal_range的内容:

  

使用键等于k的键返回包含容器中所有元素的范围的边界。在键是唯一的unordered_map容器中,范围最多包含一个元素。

答案 3 :(得分:0)

  

还在std::unordered_multimap中,它的存在是否意味着在使用迭代器迭代unordered_multimap时,具有相同键的所有元素将总是在一起吗?

通常,未定义的顺序,该顺序用于遍历std::unordered_multimap中存储的元素。但是,请注意,std::unordered_multimap通常实现为hash tables。通过分析这样的实现,您将认识到排序不会像人们最初想到的那样“未定义”。

在元素插入(或哈希表重新哈希)时,将哈希函数应用于元素的 key 所得到的值用于选择存储桶该元素将要存储的位置。两个具有相等键的元素将导致相同的哈希值,因此它们将存储在相同的存储桶中,因此它们在迭代std::unordered_multimap时会在一起 X


X 请注意,即使两个具有不同键的元素也可能导致相同的哈希值(即,冲突)。但是,std::unordered_multimap可以通过将键与相等进行比较来处理这些情况,因此仍然将具有相等键的元素组合在一起。