2013-03-24 29 views
2

mapshash_maps都被设计为pairs<key, data>。我很清楚为什么地图应该有一个排序的关键(更精确地说:树),但我不明白为什么hash_maps需要一个键,为什么它不能将数据散列并放入散列表?C++ std :: hash_map:密钥的作用是什么

我无法在文档中找到答案,也没有通过搜索网络找到答案。

+0

http://en.wikipedia.org/wiki/Hash_table没有回答你的问题? – Rapptz 2013-03-24 09:32:31

+0

所以在地图中,为什么不能单独使用数据进行排序(或树形结构)?在这两种情况下,被建模的概念都是字典的概念,这就是为什么你分解成密钥和相关数据的原因,因为这是一个有用的想法,而不是任何实现的原因。如果你不需要一个密钥,那么你正在为一个集合建模,并且你会使用一个std :: set或一个set :: unordered_set。 – john 2013-03-24 09:37:03

+0

地图不包含树的关键。地图包含一个关键字,因为它是一张地图。它将键映射到值。树形是与实现有关的。 – juanchopanza 2013-03-24 10:13:35

回答

4

std::unordered_set作品正是你所描述的方式。但是,有时您想从一个数据映射到另一个数据;这就是std::unordered_map进场的地方。

4

走向橱柜。取出电话簿并查找号码。它有一个名称和编号

+0

赞:)但接受的答案已经由亚历克斯在他之前。 – Subway 2013-03-24 09:42:23

+0

我喜欢我的隐喻。他们丰富了我的生活。享受 – 2013-03-24 09:49:19

+0

+1很棒的答案。 – 2013-03-24 18:11:22

0

散列映射也称为Unordered Map之间的映射使用KEY作为桶或其它Slots.In字的indexHASH,任何哈希表需要一个散列函数来计算index成从中可以找到正确值的桶或槽阵列。这些index是哈希表的密钥,用于在最佳情况下访问O(1)时间的数据。

+0

恐怕你是错的,关键是hash_map对结构的一部分,散列函数的结果散列是两个不同的东西。 – Subway 2013-03-24 09:44:49

0

如果要将数据本身用作密钥,则适当的容器是std::setstd::unordered_set。一张地图同时包含一个关键字和一个值; std::mapstd::unordered_map之间的差异在如何组织数据; std::map按键排序,std::unordered_map按键排序。