[英]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.