1)为什么需要hash_map
/* 例如: 我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华山派掌门人,人称君子剑 张三丰-武当掌门人,太极拳创始人 东方不败-第一高手,葵花宝典 【注】如果你使用STL 的map容器,你可以非常方便的实现这个功能,而不用关心其细节。 */ #include <map> #include <string> using namespace std; ... map<string, string> namemap; //增加 namemap["岳不群"]="华山派掌门人,人称君子剑"; namemap["张三丰"]="武当掌门人,太极拳创始人"; namemap["东方不败"]="第一高手,葵花宝典"; ... //查找 if(namemap.find("岳不群") != namemap.end()){ ... }上述程序用map去保存数据时特别效率,但是存在下面的问题: 一旦我门需要在大的数据库中频繁进行搜索时,时间复杂度大导致效率低下,因此引出hash_map! 【先介绍下为什么引出hash_map】 hash_map基于hash table(哈希表)。 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。
1、hash_map和map的区别在哪里? (1)构造函数:hash_map需要hash函数,等于函数;map只需要比较函数(小于函数). (2)存储结构(底层数据结构不同):hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。 (3)map的优点:可以自动按照Key值进行排序;hash_map优点在于它各项操作的平均时间复杂度接近常数,即O(1). (4)map属于STL标准的一部分,而hash_map则不是。 2、什么时候需要用hash_map,什么时候需要用map? (1)总体来说,hash_map 查找速度会比map快,而且查找速度基本和数据量大小,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。 (2)但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且hash_map的构造速度较慢。 【总结】现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。 3、 如何用hash_map替换程序中已有的map容器? 这个很容易,但需要你有良好的编程风格。建议你尽量使用typedef来定义你的类型: typedef map