STL-map

背景


STL的Map是属于Key Value的一种实现。数据结构上采用的是红黑树,因此属于树形结构,存储方式采用的是链式存储。

原型说明


我们可以假设目前没有STL的Map,需要由我们来设计。我们应该怎么考虑呢。

我们可以不关心是用红黑树,AVL树或者是其他二叉树,他只需要保证 1. 大小排序保证 左根右。 2. 深度必须是 log(aN)即可

剩下我们就应该关心,有这么一棵树了,我们应该怎么用他,或者说根在哪?

逻辑说明

猴子看树

其实根就在下面这个成员中保存 _Rb_tree_impl<_Compare> _M_impl;

这个成员_M_impl记录了根节点,以及end()的位置。

这个成员不属于我们心中的那棵树,他只是记录了那棵树的信息,

换句话说,你可以理解为他(_M_impl)是一个猴子,他看明白了那棵树长什么样,你要怎么玩那棵树,找他就行了。

抓几个桃子


猴子数数不错,树上如果有100个桃子,你要选第50个,他可以数几次就帮你找出来(log N)。

但是猴子很笨,过了1分钟以后,他根本记不住刚刚找的是第几个桃子给你了(有人又往树上放了几个桃子,桃子的分布改变了)。

如果你想知道1分钟以前你到底拿到的是哪个桃子,怎么办呢,给你一个魔法箱子,只要你打开里面就装了你刚才找出来的桃子,

是不是很给力哇,这就是迭代器。

幼儿园小朋友看图学知识


后面补个动画,来说明上面的过程。

数据结构


_Rb_tree 是红黑树,他包含了 key_comapre, _M_header, _M_node_count。

猴子就是盯着 _M_header 看的。 _M_header 里面包含了根节点的信息,以及树的end()。

每一个节点都包含{ color,parent,left,right }。

迭代器_Rb_tree_iterator 就是一个 节点{ color,parent,left,right }的代理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值