hashtable(c++)

hashtable学习记录


在这里插入图片描述
哈希表简单来说就是一个整数取余,余数为几就把这个元素按放在第几个位置,然而这个位置有元素呢?所以就用链表来把同一个位置的元素串起来。所以就形成了上面的结构。

上面有一个buckets vector,就是要和哪个数取余,这个有多大呢?开始为53,然后约定如果hashtable中存的元素大于bucket vector的容量就扩容,那么扩容到多大呢?就扩容到与原来两倍最接近的一个质数,就是图片右上角的那些数。

在这里插入图片描述
上面是hashtable的源码,模板参数有点多,我也没太记住,后面有需要再补充,首先看里面的数据成员,hash,equals,get_key是三个仿函数,仿函数实际上是一个结构体,但是里面没有数据成员,只有一个重载()的函数,所以这个结构体实例化的对象可以仿作函数一个来用,例如下面这样的:
在这里插入图片描述
所以这些对象都只占一个字节,另外可以看见buckets这个向量里面都存的是node类型的指针,通过这个指针延伸出去形成链表,node的结构体里的数据也给出来了,一个数据域,一个指针域,典型的链表结构,再看迭代器一个node类型指向链表中当前的元素但是当这根指针移到链表的尾端时该怎么走呢?就得靠ht指针了,ht指针指向buckets里面的指针,所以当cur指针走到链表的尾部时,ht就向右偏移。num_elements是用来统计hashtable中元素的个数的,当元素个数大于buckets的容量是就扩容,将原来的结构打散,重新计算,重新安插元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值