但是如果碰撞过多链表太长也会导致查找效率很低,于是rehash,即找到buckets的倍数附近的质数。这里比vector还要复杂,vector扩容只是换了个空间,这里不但buckets要增加,而且增加后要重新计算各个数据的位置,很花时间(这里是科学家们的经验谈)
这里不会再扩充后把扩充的数量再算一遍,而是做成一个表格写死了(各个版本标准库可能不一样),这里是大致两倍附近的质数。(也就是说元素的个数永远小于bucket的个数)
幕后英雄 :容器hashtable
名词解释:HashFcn:容器中每一个元素会有一个编号,一般容器内我们会放对象,而对象就是通过HashFcn来折射为一个编号:hashcode(/bukets就是对应对象的位置)
extractkey:由于放入容器中的可能是一包东西(比如pair),extractkey就是从这包东西中取出key。
Equalkey:比大小。 排序,比较等都是以key为基准来进行排的,如果是自定义类型,需要告诉库怎么排大小。
如果是自定义类型,需要重写HashFcn类和Equalkey类!!!!也就是下面的函数对象hash 和equals
sizeof()=20:hash,equals,get_key都是仿函数,各占1;vector里有三个指针,占12,size_type类占4个,一共19个,内存对齐补齐4的倍数,所以20个。
迭代器iterator指到链表末尾时为了接上vector中下一个list的表头,单独设计了cur