std::unordered_map 如何实际使用哈希函数?

时间:2021-06-04 20:42:04

标签: c++ hash

我不太清楚标准 std::unordered_map 容器如何使用散列。

我对散列非常陌生,现在我正在努力通过我的大学数据结构考试。

我明白,如果我有一组对象,我必须根据标准尽可能随机地对它们的键进行分组,以便它们尽可能均匀地分布在某些桶中,然后我可以不断地搜索/插入/删除时间通过查看与散列键关联的存储桶(这主要是链式散列的作用,如果我错了,请纠正我)。

但是,std::unordered_map 如何使用散列?它如何使用散列设置新的(键,值)对?我的意思是,我知道散列会根据某些标准对键进行分组,但它如何使用散列设置新的(键、值)对完全不清楚。

1 个答案:

答案 0 :(得分:3)

对于大多数标准库容器来说,答案是:无论如何,这是一个留给库作者的实现细节。

但是,unordered_map 在这方面有点奇怪,因为它不仅必须以某种方式运行,而且还对其实施方式施加了限制。

来自标准:http://eel.is/c++draft/unord.req#general-9

<块引用>

无序关联容器的元素被组织成桶。具有相同哈希码的键出现在同一个桶中。当元素添加到无序关联容器时,桶的数量会自动增加,以便每个桶的平均元素数保持在一个界限以下。重新散列会使迭代器失效,更改元素之间的顺序,并更改元素出现在哪些桶中,但不会使元素的指针或引用失效。对于 unordered_multiset 和 unordered_multimap,重新散列保留等效元素的相对顺序。

简而言之,地图在任何给定时间都有 N 个桶。散列函数的结果用于通过沿着 bucket_id = hash_value % N 的行做一些事情来选择一个桶。如果桶开始变得太“满”,地图将增加 N,并重新组织其内容。

存储桶中的事物是如何组织的并没有真正指定。它通常是一个链表。