0

我正在使用 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:
哈希:572570820 人是:姐姐 - 身高是 5.3
哈希:306541572 人是:爸爸 - 身高是 5.1
哈希:1076885014 人是:妈妈 - 身高是 5.3
哈希:2613037907 人是:扎克 - 身高是 6.2
按任意关键继续。. .

4

1 回答 1

3

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

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

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

于 2012-10-13T20:09:23.247 回答