C++ std::unordered_映射如何从bucket返回正确的值

C++ std::unordered_映射如何从bucket返回正确的值,c++,unordered-map,C++,Unordered Map,我有一张std::无序的地图 然后在其中插入大量元素,但字符串键都是唯一的 以下情况是否可能,如何处理 map[x] = 5; map[y] = 3; 让我们假设x和y是不同的字符串,但它们产生相同的散列,因此5和3放在同一个桶中 当我们尝试使用map[x]检索值时,map如何返回正确的值5?散列x将给出包含两个元素5、3的bucket,但我不知道它如何在没有键本身进行比较的情况下获得正确的值 我遗漏了什么?的完整声明如下: template < class Key, c

我有一张
std::无序的地图

然后在其中插入大量元素,但字符串键都是唯一的

以下情况是否可能,如何处理

map[x] = 5;
map[y] = 3;
让我们假设
x
y
是不同的字符串,但它们产生相同的散列,因此5和3放在同一个桶中

当我们尝试使用
map[x]
检索值时,map如何返回正确的值5?散列
x
将给出包含两个元素5、3的bucket,但我不知道它如何在没有键本身进行比较的情况下获得正确的值

我遗漏了什么?

的完整声明如下:

template <
    class Key,
    class T,
    class Hash      = std::hash<Key>,
    class KeyEqual  = std::equal_to<Key>,
    class Allocator = std::allocator<std::pair<Key const, T>>
> class unordered_map;
模板<
类密钥,
T类,
类Hash=std::Hash,
类KeyEqual=std::等于,
类分配器=std::分配器
>类无序图;
请注意,它需要一个哈希函数和一个密钥类型的相等比较器

在搜索具有特定键的元素时,容器将首先使用哈希函数找到正确的bucket,然后遍历该bucket中的元素,使用相等比较器比较每个元素的键。

的完整声明如下所示:

template <
    class Key,
    class T,
    class Hash      = std::hash<Key>,
    class KeyEqual  = std::equal_to<Key>,
    class Allocator = std::allocator<std::pair<Key const, T>>
> class unordered_map;
模板<
类密钥,
T类,
类Hash=std::Hash,
类KeyEqual=std::等于,
类分配器=std::分配器
>类无序图;
请注意,它需要一个哈希函数和一个密钥类型的相等比较器


当搜索具有特定键的元素时,容器将首先使用哈希函数找到正确的bucket,然后遍历该bucket中的元素,使用相等比较器比较每个元素的键。

bucket就是一个bucket。无序映射实际上是一个模板,其中包括一个键和值类型,以及一个检查键是否相等(默认为
std::equal_to
)的函数。它使用相等比较来查找bucket中与搜索的值匹配的元素


哈希表通常会退化为线性时间或日志时间,如果您完全邪恶,并向它们提供大量冲突的密钥,实际上它们通常接近O(1)。

bucket就是一个bucket。无序映射实际上是一个模板,其中包括一个键和值类型,以及一个检查键是否相等(默认为
std::equal_to
)的函数。它使用相等比较来查找bucket中与搜索的值匹配的元素


如果你完全是邪恶的,并且给它们提供了大量冲突的键,那么哈希表通常会退化为线性时间或日志时间,实际上它们通常接近O(1)。

你以前写过哈希表实现吗?@WhozCraig no我没有。当然,映射必须将键和值一起存储,不仅仅是它的杂烩。如果只是因为
map.begin()->first
必须返回键。因此,一旦它进入正确的存储桶,它就会在那里进行常规搜索。在任何哈希表中,哈希只是到达存储桶的一种方式。这就像一条线索。一旦你到达那里,你仍然需要做相等比较来检索结果。事实上,可以有一个哈希表,其中所有值都具有相同的哈希。它的性能非常糟糕。你以前写过哈希表实现吗?@WhozCraig不,我没有。当然,映射必须将键与值一起存储,而不仅仅是其哈希。如果只是因为
map.begin()->first
必须返回键。因此,一旦它进入正确的存储桶,它就会在那里进行常规搜索。在任何哈希表中,哈希只是到达存储桶的一种方式。这就像一条线索。一旦你到达那里,你仍然需要做相等比较来检索结果。事实上,可以有一个哈希表,其中所有值都具有相同的哈希。我想你会发现,如果你仔细想想,你的第一句话实际上并不是真的。水桶不是真正的水桶。这只是一个比喻。我想你会发现,如果你仔细想想,你的第一句话实际上不是真的。水桶不是真正的水桶。那只是个比喻。