分享

STL hash_map

 sky_feiyang 2014-07-12
  1. #include  <cstdlib>  
  2. #include  <iostream>  
  3. #include  <string>  
  4. #include  <hash_map> 
  5. /*-------------------------------------------*/  
  6. using  namespace std;  
  7. /*-------------------------------------------*/  
  8. /*函数类 
  9.  *作为hash_map的hash函数  
  10.  *string没有默认的hash函数  
  11.  */   
  12. class str_hash{  
  13.       public:  
  14.        size_t operator()(const string& str) const  
  15.         {  
  16.                 unsigned long __h = 0;  
  17.                 for (size_t i = 0 ; i < str.size() ; i ++)  
  18.                 __h = 5*__h + str[i];  
  19.                 return size_t(__h);  
  20.         }  
  21. };  
  22. /*-------------------------------------------*/  
  23. /*函数类  
  24.  *作为hash_map的比较函数 ) 
  25.  *(查找的时候不同的key往往可能对用到相同的hash值 
  26. */   
  27. class str_compare  
  28. {  
  29.       public:  
  30.              bool operator()(const string& str1,const string& str2)const  
  31.              {return   str1==str2;}  
  32. };  
  33. /*-------------------------------------------*/  
  34. int   
  35. main(int argc, char *argv[])  
  36. {    
  37.     hash_map<string,string,str_hash,str_compare>  myhash;  
  38.       
  39.     myhash["google"]="newplan";  
  40.      
  41.     myhash["baidu"]="zhaoziming";  
  42.      
  43.     if(myhash.find("google")!=myhash.end())  
  44.       cout<<myhash["google"]<<endl;  
  45.       
  46.     system("PAUSE");  
  47.       
  48.     return EXIT_SUCCESS;  
  49. }             

 

 

在SGI STL中,提供了以下hash函数:                   

  1. struct hash<char*>
  2. struct hash<const char*>
  3. struct hash<char> 
  4. struct hash<unsigned char> 
  5. struct hash<signed char>
  6. struct hash<short>
  7. struct hash<unsigned short> 
  8. struct hash<int> 
  9. struct hash<unsigned int>
  10. struct hash<long> 
  11. struct hash<unsigned long>

在声明自己的hash函数时要注意以下几点:
    1、使用struct,然后重载operator();
    2、返回size_t;
    3、参数是你要hash的key的类型;
    4、函数是const类型的;

 

hash_map和map的区别在哪里?
    (1)构造函数  hash_map需要hash函数,等于函数;map只需要比较函数(小于函数)。
    (2)存储结构  hash_map采用hash表存储,map一般采用红黑树实现。因此内存数据结构是不一样的。

什么时候需要使用hash_map,什么时候需要map?
    总体来说,hash_map 查找速度会比map快,而且查找速度基本和数据数据量大小,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小, hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。但若你对内存使用特别严格,希望 程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且 hash_map的构造速度较慢。
    现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。

为什么hash_map不是标准的?
    具体为什么不 是标准的,我也不清楚,有个解释说在STL加入标准C++之时,hash_map系列当时还没有完全实现,以后应该会成为标准。如果谁知道更合理的解释, 也希望告诉我。但我想表达的是,正是因为hash_map不是标准的,所以许多平台上安装了g++编译器,不一定有hash_map的实现。我就遇到了这 样的例子。因此在使用这些非标准库的时候,一定要事先测试。另外,如果考虑到平台移植,还是少用为佳。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多