unordered_set,unordered_multiset,unordered_map,unordered_multimap底层原理剖析

但是如果碰撞过多链表太长也会导致查找效率很低,于是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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值