Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::unordered_映射实际上是如何使用哈希函数的?_C++_Hash - Fatal编程技术网

C++ std::unordered_映射实际上是如何使用哈希函数的?

C++ std::unordered_映射实际上是如何使用哈希函数的?,c++,hash,C++,Hash,我不太清楚标准std::无序映射容器如何使用哈希 我对哈希非常陌生,现在我正努力通过大学数据结构考试 我知道,如果我有一个对象集合,我必须根据一个标准尽可能随机地对它们的键进行分组,以便它们尽可能均匀地位于某些存储桶中,然后我可以通过查看与散列键关联的存储桶来在固定时间内搜索/插入/删除这主要是使用链式散列的功能,如果我错了,请纠正我 但是,std::unordered_映射如何使用哈希?它如何使用哈希设置新的键、值对?我的意思是,我知道散列将根据一些标准对键进行分组,但它如何使用散列设置新的键

我不太清楚标准std::无序映射容器如何使用哈希

我对哈希非常陌生,现在我正努力通过大学数据结构考试

我知道,如果我有一个对象集合,我必须根据一个标准尽可能随机地对它们的键进行分组,以便它们尽可能均匀地位于某些存储桶中,然后我可以通过查看与散列键关联的存储桶来在固定时间内搜索/插入/删除这主要是使用链式散列的功能,如果我错了,请纠正我


但是,std::unordered_映射如何使用哈希?它如何使用哈希设置新的键、值对?我的意思是,我知道散列将根据一些标准对键进行分组,但它如何使用散列设置新的键、值对还不清楚。

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

然而,无序的_映射在这方面有点奇怪,因为它不仅必须以某种方式运行,而且在如何实现方面也有一些限制

根据标准:

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

简而言之,map在任何给定时间都有N个bucket。散列函数的结果用于通过沿bucket_id=散列_值%N的行执行操作来拾取bucket。如果bucket开始变得太满,映射将增加N,并重新组织其内容


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

对于大多数标准的库容器,答案是:不管感觉如何,它是一个留给库编写者的实现细节

然而,无序的_映射在这方面有点奇怪,因为它不仅必须以某种方式运行,而且在如何实现方面也有一些限制

根据标准:

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

简而言之,map在任何给定时间都有N个bucket。散列函数的结果用于通过沿bucket_id=散列_值%N的行执行操作来拾取bucket。如果bucket开始变得太满,映射将增加N,并重新组织其内容


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

编译器的include目录中有完整的源代码。在VC++的例子中,算法需要注意的是,值不涉及仅散列的关键问题。要理解散列表,请看一看,编译器的include目录中有完整的源代码。在VC++的例子中,算法需要注意的是,值不涉及散列-仅涉及关键问题。要理解散列表,请看一看,并感谢Frank。我的老师曾经告诉我们,Python字典和C++ STD::unordeDelphi使用散列,因为它是最基本的东西,我只是觉得这是我丢失的东西。所以事情并不是那么简单和清楚。…@DavidC.Rankin我知道什么是哈希表,我不知道它在std::unordered_map的实现中是如何使用的。@Johnny:你知道std::unordered_map实际上只是一个名字古怪的哈希表吗?谢谢,弗兰克。我的老师曾经告诉我们,Python字典和C++ STD::unordeDelphi使用散列,因为它是最基本的东西,我只是觉得这是我丢失的东西。所以事情并不是那么简单和清晰。…@DavidC.Rankin我知道什么是哈希表,我不知道它在std::unordered_map的实现中是如何使用的。@Johnny:你知道std::unordered_map实际上只是一个名字奇怪的哈希表吗?