从某种意义上来说,lower_bound
中没有upper_bound
和std::unordered_map
,因为元素没有顺序。
然而,std::unordered_map
具有方法equal_range
。它返回对应于键的范围的迭代器。
这有什么意义?因为在std::unordered_map
中只能有一个带键的元素。这只是find
方法。
还在std::unordered_multimap
中,它的存在是否意味着在使用迭代器迭代unordered_multimap
时,具有相同键的所有元素将总是在一起吗?
答案 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
可以通过将键与相等进行比较来处理这些情况,因此仍然将具有相等键的元素组合在一起。