一、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那样有键-值对,这里单纯就是为了方便查询这些值。