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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值