hash_map 这个非stl的容器,基于hash table实现

网上很多资料博客,照搬照抄很多,主要讲述了它和关联容器(基于红黑数)之间的关系以及区别,比如map。楼主是一个不喜欢一上来就看那么多文字的人,楼主喜欢先了解怎么用,然后再去进行原理的分析,但是这样的教我使用的demo实在难找,so 才有了这篇文字。


头文件

 linux下:

#include <ext/hash_map>

windows下好像是:

#include <hash_map>


using namespace __gnu_cxx;
using namespace std;


struct str_myhash{
   size_t operator()(const string& key) const  // const function  //reload operator()  //param is hash key type
   {
        printf("-----------str_myhash-------------\n");
        return __stl_hash_string(key.c_str());
   }//The result type must be size_t
};


struct str_myeq
{
  bool operator()(string s1, string s2) const
  {
      printf("===========str_myeq================\n");
      return (s1==s2)?true:false;
  }
};


    hash_map<string, string, str_myhash, str_myeq>  myhashmap;  // function object ,类型str_myhash, str_myeq 对象调用成员函数--运算符重载

   myhashmap["123"] = "yuebuquan";   // 根据key生成hash_key 赋值
   cout<< myhashmap["123"] <<endl;    // 根据key生成hash_key 然后调用查询进行比较

-----------------------out print---------------------------------------------------

-----------str_myhash-------------
-----------str_myhash-------------
===========str_myeq================


承上:

用[]进行hash_map数据插入其实是先查找是否有相同的有就修改,没有就添加 。

效率不同于如下语句(是直接插入,map也是一样)

myhashmap.insert(make_pair("456", "haha"));

myhashmap.insert(pair<string, string>("345", "test"));



struct myless
   {
       bool operator() (const string& str1, const string& str2) const
       {
            cout<<"-------------in myless-------------" <<endl;
            return str1<str2;
       }
   };

  map<string, string, myless> mymap;

   mymap["test1"] = "data1";
   //mymap["test1"] = "data2";  //先找,到后是修改,找不到是插入
   mymap.insert(make_pair("test1", "data2")); //直接插入,因为key相同的已经存在,所以插入会失败
   cout<<mymap["test1"]<<endl; // 用[] 和用insert结果就不一样了

猜你喜欢

转载自blog.csdn.net/fengdijiang/article/details/78809690
今日推荐