C++中map,hash_map,unordered_map,unordered_set区别与联系

一、hash_map、unordered_map

这两个的内部结构都是采用哈希表来实现。区别在哪里?unordered_map在C++11的时候被引入标准库了,而hash_map没有,所以建议还是使用unordered_map比较好。
哈希表的好处是什么?查询平均时间是O(1)。顾名思义,unordered,就是无序了。无序容器在存储上组织为一组桶,每个桶保存零个或多个元素。无序容器使用一个哈希函数将元素映射到桶。容器将具有一个特定哈希值的所有元素都保存到相同的桶中。如果容器中允许重复关键字,所有具有相同关键字的元素都会在同一个桶中,因此,无序容器的性能依赖于哈希函数的质量和桶的数量和大小。

二、unordered_map与map

1、内部实现的结构不同,map使用R-B-tree(红黑树)实现的,保证了一个稳定的动态操作时间,查询、插入、删除都是O(logN),最坏和平均都是。然而unordered_map如前所述,是哈希表。顺便提一下,哈希表的查询时间虽然是O(1),但是并不是unordered_map查询时间一定比map短,因为实际情况中还要考虑到数据量,而且unordered_map的hash函数的构造速度也没那么快.所以不能一概而论,应该具体情况具体分析。

2、map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中。所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的。顺序就是按照operator<定义的大小排序。而unordered_map是计算元素的Hash值,根据Hash值判断元素是否相同。所以,对unordered_map进行遍历,结果是无序的。

3、用法的区别就是,map的key需要定义operator<。 而unordered_map需要定义hash_value函数并且重载operator==。对于内置类型,如string,这些都不用操心。对于自定义的类型做key,就需要自己重载operator==或者hash_value()了。

最后,当不需要结果排好序时,最好用unordered_map

三、unordered_map与unordered_set

后者就是在哈希表插入value,而这个value就是它自己的key,而不是像之前的unordered_map那样有键-值对,这里单纯就是为了方便查询这些值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章