C++ 自定义哈希函数使得自制数据类型也可使用STL的哈希set,map

当需要使用STL的哈希集合(如set、map)但存储的是自定义class时,需要重写哈希和相等判断函数。本文介绍了如何为自定义的vec3类定义哈希函数和等于判断函数,以解决哈希冲突并确保STL哈希容器的正常工作。
摘要由CSDN通过智能技术生成

如果想用哈希的时候,但是哈希的目标又不再STL标准的类型内,比如一个自定义的class,就不太方便使用STL默认的哈希函数,比较函数,那么就需要重写了

什么是哈希

哈希就是搞一大块内存,然后给他们编号,然后通过一定的手段,对每个要存储的对象,尽量通过哈希函数得到不同的值,根据这个值放到对应的内存中

冲突
假设使用的哈希函数是 %4 ,要存储的数据类型是int,存储 16 和 64 这两个数字的时候,会发现 %4 都=0,那么照成了冲突,但是哈希set/map底层会帮我们处理(比如使用线性探查向后找空位),所以我们

  • 不但需要定义哈希函数,还要定义判断是否等于的函数

数据类型定义:
现在定义一个三维的向量vec3

class vec3
{
   
public:
	vec3();
	vec3(int _x, int _y, int _z){
   x=_x; y=_y; z=_z;}
	int x,y,z;
};

定义哈希函数:
根据向量的每一个维度的不同,通过一定的计算,得到一个值,注意类型要用size_t来返回

这里定义的哈希值是 hashval = x*14514 + y*19 + z

struct hashfunc
{
   
	size_t operator()(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值