背景
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 }的代理。