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<const char*>()(p.name.c_str()); //总是报错,原来是因为不同的string类型的对象,转化成const char*后,哈希值是不一样的!!! //于是把person的哈希值改成年龄的哈希值加上名字第一个字母的哈希值 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”
时间: 2024-10-11 01:22:04