一。红黑树的改造
map 和 set 底层都是通过红黑树实现的,但是 set 中存放的是 key,map 中为 key,value。我们不会去写两棵红黑树来实现它们,因为代码会重复,需要对红黑树内部进行改造。
template<class K,class T,class KOfT>
为了可以同时处理 set 和 map,传一个 T 过去,是 set 的时候为 key,map 为 pair<K,V>。
对于 set 和 map 他们的排序,set 可以直接通过 key 来排序,而 map 的排序规则与 set 不同,先比较 key,如果相同比较 value,所以传一个 KOfT。
struct SetKeyOfT { const K& operator()(const K& k) { return k; } };
struct MapKeyOfT { const K& operator()(const pair<K, V>& kv) { return kv.first; } };
通过 KOfT 来分别处理 set 和 map 的排序。
红黑树的迭代器
iterator begin() { Node* cur = _root; while (cur && cur->_left) { cur = cur->_left; } return iterator(cur); }
iterator end() { return iterator(nullptr); }
operator++ 与 operator--
Self& operator++() {
// 如果右不为空,中序的下一个就是右子树的最左节点
// 如果右为空,表示_node 所在子树访问完,下一个节点在他的祖先中找
(_node->_right) {
Node* subLeft = _node->_right;
(subLeft->_left) { subLeft = subLeft->_left; }
_node = subLeft;
} {
Node* cur = _node;
Node* parent = cur->_parent;
(parent && cur == parent->_right) {
cur = cur->_parent;
parent = parent->_parent;
}
_node = parent;
}
*;
}
Self& --() {
*;
}


