在www.CPlusPlus.com上,它为unordered_multimap指出以下内容,
具有等效键的元素在同一个存储桶中组合在一起,并且迭代器(请参阅equal_range)可以遍历所有这些元素。
我知道我们无法从该声明中推断出这一点,但我想知道给定的存储桶仅是否包含具有等效键的元素?
答案 0 :(得分:5)
以下是唯一相关的要求:
[C++11: 23.2.5/5]:
如果容器的k1
函数对象在传递这些值时返回true,则认为类型k2
的两个值Key
和key_equal
是等效的。如果k1
和k2
等效,则哈希函数将为两者返回相同的值。 [..]
[C++11: 23.2.5/8]:
无序关联容器的元素被组织到存储桶中。具有相同哈希码的密钥出现在同一个存储桶中。 [..]
没有任何内容禁止将带有密钥哈希a
和所有元素的所有元素与密钥哈希b
存储在同一个存储桶中。您可以使用标准库实现来判断是否使用了此事实。
没有标准的措辞来明确这一点;它是由遗漏定义的。
答案 1 :(得分:2)
具有相同密钥的元素将最终位于同一个存储桶中,但其他元素也可能最终位于同一存储桶中。您无法推断同一个存储桶中的所有元素都具有相等的密钥。
我不认为规范明确地说明了这一点,但是unordered_map的工作方式是它使用密钥的散列来确定元素进入哪个桶。两个键可以散列到相同的值,将意味着两个键都将被放入同一个桶中。但是,具有相同键的两个元素将具有相同的哈希值,因此始终位于同一个桶中。此外,由于可以在构造函数中设置存储桶的数量,因此每个存储桶必须包含一系列密钥,但范围会随着存储桶数量的变化而变化。
你可以,有一个unordered_multimap试图平均每100个元素使用一个桶,这将符合(并且非常愚蠢),但是如果你的元素少于100个,它将把所有元素放在一个元素中桶。