【hash_map】hash_map中键为自定义类型的操作

来源:互联网 发布:材料力学800题淘宝 编辑:程序博客网 时间:2024/06/03 23:44

class person{public:string name;int age;person(string s,int i):name(s),age(i){}};struct person_hash{static const size_t   bucket_size = 4;static const size_t   min_buckets = 8;//哈希值函数size_t operator()(const person &p)const{return hash<int>()(p.age)+hash<char>()(p.name[0]);}//小于号比较函数bool operator()(const person &p1,const person &p2)const{if(p1.name<p2.name)return true;else if(p1.name>p2.name)return false;else{return p1.age<p2.age;}}};//测试代码hash_map<person,string,person_hash> a;person p1("Tom",22);person p2("Jim",40);a.emplace(p1,"1553");a.emplace(p2,"6667");cout<<a[p2]<<endl; //输出字符串“6667”

原来结构体person_hash中使用的哈希函数是 hash<int>()(p.age)+hash<const char*>()(p.name.c_str()),结果总是报错,后来发现是因为 “相等但不是同一个” string类型的对象,转化成const char*后,哈希值不一样!
比如
string a="hh";
string b="hh";
cout<<hash<const char*>()(a.c_str())<<endl;
cout<<hash<const char*>()(b.c_str())<<endl;

字符串a和b输出的哈希值不一样。





1 0
原创粉丝点击