网上很多资料博客,照搬照抄很多,主要讲述了它和关联容器(基于红黑数)之间的关系以及区别,比如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结果就不一样了