std :: unordered_multimap的存储桶是否仅包含具有等效键的元素

时间:2014-05-16 23:52:43

标签: c++ std unordered-map

在www.CPlusPlus.com上,它为unordered_multimap指出以下内容,

  

具有等效键的元素在同一个存储桶中组合在一起,并且迭代器(请参阅equal_range)可以遍历所有这些元素。

我知道我们无法从该声明中推断出这一点,但我想知道给定的存储桶是否包含具有等效键的元素?

2 个答案:

答案 0 :(得分:5)

以下是唯一相关的要求:

  

[C++11: 23.2.5/5]:如果容器的k1函数对象在传递这些值时返回true,则认为类型k2的两个值Keykey_equal是等效的。如果k1k2等效,则哈希函数将为两者返回相同的值。 [..]

     

[C++11: 23.2.5/8]:无序关联容器的元素被组织到存储桶中。具有相同哈希码的密钥出现在同一个存储桶中。 [..]

没有任何内容禁止将带有密钥哈希a所有元素的所有元素与密钥哈希b存储在同一个存储桶中。您可以使用标准库实现来判断是否使用了此事实。

没有标准的措辞来明确这一点;它是由遗漏定义的。

答案 1 :(得分:2)

具有相同密钥的元素将最终位于同一个存储桶中,但其他元素也可能最终位于同一存储桶中。您无法推断同一个存储桶中的所有元素都具有相等的密钥。

我不认为规范明确地说明了这一点,但是unordered_map的工作方式是它使用密钥的散列来确定元素进入哪个桶。两个键可以散列到相同的值,将意味着两个键都将被放入同一个桶中。但是,具有相同键的两个元素将具有相同的哈希值,因此始终位于同一个桶中。此外,由于可以在构造函数中设置存储桶的数量,因此每个存储桶必须包含一系列密钥,但范围会随着存储桶数量的变化而变化。

你可以,有一个unordered_multimap试图平均每100个元素使用一个桶,这将符合(并且非常愚蠢),但是如果你的元素少于100个,它将把所有元素放在一个元素中桶。