hashtable学习记录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8d8b6e36c6b3e8d522ec32d4bcf7592f.png)
哈希表简单来说就是一个整数取余,余数为几就把这个元素按放在第几个位置,然而这个位置有元素呢?所以就用链表来把同一个位置的元素串起来。所以就形成了上面的结构。
上面有一个buckets vector,就是要和哪个数取余,这个有多大呢?开始为53,然后约定如果hashtable中存的元素大于bucket vector的容量就扩容,那么扩容到多大呢?就扩容到与原来两倍最接近的一个质数,就是图片右上角的那些数。
上面是hashtable的源码,模板参数有点多,我也没太记住,后面有需要再补充,首先看里面的数据成员,hash,equals,get_key是三个仿函数,仿函数实际上是一个结构体,但是里面没有数据成员,只有一个重载()的函数,所以这个结构体实例化的对象可以仿作函数一个来用,例如下面这样的:
所以这些对象都只占一个字节,另外可以看见buckets这个向量里面都存的是node类型的指针,通过这个指针延伸出去形成链表,node的结构体里的数据也给出来了,一个数据域,一个指针域,典型的链表结构,再看迭代器一个node类型指向链表中当前的元素但是当这根指针移到链表的尾端时该怎么走呢?就得靠ht指针了,ht指针指向buckets里面的指针,所以当cur指针走到链表的尾部时,ht就向右偏移。num_elements是用来统计hashtable中元素的个数的,当元素个数大于buckets的容量是就扩容,将原来的结构打散,重新计算,重新安插元素。