繁体   English   中英

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

[英]How does std::unordered_map actually use hash functions?

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

我对散列很陌生,现在我正在尝试通过我的大学数据结构考试。

我知道,如果我有一组对象,我必须按照标准将它们的键尽可能随机分组,以便它们尽可能均匀地分布在某些存储桶中,然后我可以通过查找在恒定时间内搜索/插入/删除进入与散列键关联的存储桶(这主要是链式散列所做的,如果我错了,请纠正我)。

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

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

然而, unordered_map在这方面有点奇怪,因为它不仅必须以某种方式表现,而且它还具有应用于其实现方式的约束。

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

无序关联容器的元素被组织成桶。 具有相同 hash 代码的密钥出现在同一个存储桶中。 随着元素被添加到无序关联容器中,桶的数量会自动增加,因此每个桶的平均元素数保持在一个界限以下。 重新散列使迭代器无效、更改元素之间的顺序以及更改哪些桶元素出现在其中,但不会使指针或对元素的引用无效。 对于 unordered_multiset 和 unordered_multimap,重新散列保留了等效元素的相对顺序。

简而言之,map 在任何给定时间都有N个存储桶。 hash function 的结果用于通过执行bucket_id = hash_value % N的操作来挑选一个桶。 如果桶开始变得太“满”,map 将增加N并重新组织其内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM