我正在使用Visual Studio 2010,我正在使用C ++ 11功能std :: unordered_map :: hash_function()来打印为每个键字符串计算的哈希值。
但是我发现内部条目是以随机顺序存储的,而不是按哈希值的递增顺序存储。
在下面的示例中,Dad计算到最低的哈希值,并且应该是my_family_height_map的开始条目,但事实并非如此。并且起始元素是sis对,其计算的哈希值比爸爸更高。
有人解释为什么我看到这种奇怪的行为?// unorderedmap_usage.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <unordered_map>
#include <string>
#include <iostream>
int main()
{
typedef std::unordered_map<std::string, double> height_map;
height_map my_family_height_map;
my_family_height_map["Dad"] = 5.10;
my_family_height_map["Mom"] = 5.3;
my_family_height_map["Sis"] = 5.3;
my_family_height_map["Zach"] = 6.2;
height_map::const_iterator c_it;
// Print everything in the map
for(c_it = my_family_height_map.begin(); c_it!= my_family_height_map.end(); ++c_it)
{
std::cout << "Hash:" << hasher_func(c_it->first) << " Person is : " << c_it->first << " - height is " << c_it->second << "\n";
}
}
O / P:
Hash:572570820人是:Sis - 身高是5.3
哈希:306541572人是:爸爸 - 身高是5.1
哈希:1076885014人是:妈妈 - 身高是5.3
哈希:2613037907人是:扎克 - 身高是6.2
按任意键继续 。 。点。
答案 0 :(得分:3)
无名地图顾名思义就是 无序 。规范中没有要求说必须按照增加哈希的顺序迭代条目。或减少哈希。或任何事情,这就是为什么它被称为“无序”。 1
如果您需要技术细节,则必须将哈希值转换为bin索引。这是通过一些截断/包装/等算法完成的,基于哈希表中的二进制数。这就是它无序的原因;因为迭代的顺序通常是二进制的顺序,而不必与哈希的顺序相匹配。
1 从技术上讲,它被称为“无序”,因为许多C ++标准库实现已经附带了名为hash_map/set/etc
的类型。委员会不想与他们重叠。