图解UE容器TMap

看完代码实现后过一段时间很容易遗忘一些细节,趁着刚看完TMap相关代码,赶紧画了个图方便下次快速回忆起来。

示意图

在这里插入图片描述

TMap

TMap是HashMap,而HashMap就必须要解决哈希冲突。教科书上介绍了两种方法解决哈希冲突(拉链法、开放地址法)。开放地址法在遇到冲突时会占用附近桶,在一些极端情况下性能可能极大程度的劣化。拉链法则是用链表去串联相同桶的元素,但是因为链表中每个元素是单独分配内存,在遍历Map的时候会因为Cache Miss导致性能急速下降。UE的TMap是拉链法的优化,通过引入TSparseArray确保了Map中的元素都是内存紧邻的,从而避免了Cache Miss。可以简单理解为TMap分了两层(外层Hash层,里层数据存储层)。首先通过计算Key的hash快速定位到桶,再根据桶中首元素的索引拿到哈希冲突链表的首元素。

TSparseArray

可以简单理解为:TSparseArray由TBitArray以及数据数组组成。但是TSparseArray特别的地方在于,它的数组允许有空洞。比特位为1的为有效数据,为0的就是空洞。有效数据就是调用了构造函数的元素。有效数据析构后就又恢复成了空洞。

迭代器遍历顺序

TMap的迭代器本质其实就是遍历TSparseArray,TBitArray中每个bit标记了对应位置的元素是否有效,每次迭代器的步进就是根据TBitArray找到下一个有效数据。

小知识

TMap是基于TSet实现的(TMap有一个TSet类型的成员变量Pairs),并且支持排序(根据Key或者Value)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值