std :: unordered_map不会按哈希值的递增顺序存储条目

时间:2012-10-13 20:05:05

标签: c++ stl c++11 unordered-map

我正在使用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
按任意键继续 。 。点。

1 个答案:

答案 0 :(得分:3)

无名地图顾名思义就是 无序 。规范中没有要求说必须按照增加哈希的顺序迭代条目。或减少哈希。或任何事情,这就是为什么它被称为“无序”。 1

如果您需要技术细节,则必须将哈希值转换为bin索引。这是通过一些截断/包装/等算法完成的,基于哈希表中的二进制数。这就是它无序的原因;因为迭代的顺序通常是二进制的顺序,而不必与哈希的顺序相匹配。

1 从技术上讲,它被称为“无序”,因为许多C ++标准库实现已经附带了名为hash_map/set/etc的类型。委员会不想与他们重叠。