std::unordered_map实际上是如何使用散列函数的



我不太清楚标准std::unordered_map容器是如何使用哈希的。

我对哈希还很陌生,现在我正努力通过大学的数据结构考试。

我知道,如果我有一个对象集合,我必须根据一个标准尽可能随机地对它们的密钥进行分组,以便它们尽可能均匀地放在一些桶中,然后我可以通过查看与哈希密钥相关的桶来实时搜索/插入/删除(这主要是使用链接进行哈希的作用,如果我错了,请纠正我(。

但是,std::unordered_map是如何使用哈希的呢?它是如何使用哈希设置一个新的(键,值(对的?我的意思是,我知道哈希会根据一些标准对密钥进行分组,但目前还不清楚它是如何使用哈希设置新的(密钥、值(对的。

对于大多数标准库容器,答案是:不管感觉如何,这是一个由库的编写者决定的实现细节。

然而,unordered_map在这方面有点特殊,因为它不仅必须以某种方式表现,而且在实现方式上也有限制。

根据标准:http://eel.is/c++草稿/无订单要求#general-9

无序关联容器的元素被组织到桶中。具有相同哈希代码的密钥出现在同一存储桶中。当元素被添加到无序的关联容器中时,bucket的数量会自动增加,因此每个bucket的平均元素数量保持在界限以下。Rehashing会使迭代器失效,更改元素之间的顺序,以及更改元素出现在哪个bucket中,但不会使指向元素的指针或引用失效。对于无序多重集和无序多重映射,重新散列保留了等价元素的相对排序。

简而言之,映射在任何给定时间都有N存储桶。散列函数的结果用于通过按照bucket_id = hash_value % N的行执行某些操作来选择一个bucket。如果桶开始变得太"满";"满";,映射将增加N并重新组织其内容。

如何在一个桶中组织事物并没有具体说明。它通常是一个链表。

最新更新