template<class T>
struct RBTreeNode
{
RBTreeNode* _left;
RBTreeNode* _right;
RBTreeNode* _parent;
T _data;
Colour _col;
RBTreeNode(const T& data)
:_left(nullptr)
, _right(nullptr)
, _parent(nullptr)
, _data(data)
, _col(RED)
{
}
};
template<class K, class T,class KeyofT>
class RBTree
{
....

iterator要确保和官方迭代器名字一致就可以用范围for。template<class T, class Ref, class Ptr>
struct RBTreeiterator //类模板
{
typedef RBTreeNode<T> Node;...
typedef RBTreeiterator<T, Ref, Ptr> Self;
Node* _node;
RBTreeiterator(Node* node = nullptr)
:_node(node)
{
}
//*it 对一个指针解引用,取到的是节点里面的数据
Ref operator*()
{
return _node->_data;
}
Ptr operator->()
{
return &_node->_data;
}
//红黑树迭代器的前置++ 返回是自增以后的迭代器
Self& operator++()
{
if (_node->_right)
{
//右边存在,找右子树最左边的那个节点
Node* subRL = _node->_right;
//左子树到头了,此刻的subRL就是右子树里最左边的节点
while (subRL->_left)
{
subRL = subRL->_left;
}
_node = subRL;
}
else//代表当前这个子树访问完了,左 中 右 找此根的父亲,该父亲的左孩子是此根。
{
Node* cur = _node;
Node* parent = _node->_parent;
while (parent&& parent->_right==cur)
{
cur = parent;
parent = cur->_parent;
}
_node = parent;
}
return *this;
}
bool operator!=(const Self& s)const
{
return _node != s._node;
}
bool operator==(const Self& s) const
{
return _node == s._node;
}
};
typedef typename RBTree<K, pair<const K, V>, MapKeyOfT>::iterator iterator;告诉编译器那一长托是个类型,不然编不过去。template < class K, class V>
class map
{
struct MapKeyOfT //把 K 提取出来
{
const K& operator()(const pair<const K, V>& kv)
{
return kv.first;
}
};
public:
typedef typename RBTree<K, pair<const K, V>, MapKeyOfT>::iterator iterator;
iterator begin()
{
return _t.begin();
}
iterator end()
{
return _t.end();
}
//iterator --》 结点的数据类型
pair<iterator, bool> insert(const pair<const K, V>& kv)
{
return _t.Insert(kv);
}
V& operator[](const K& key)
{
pair<iterator, bool> ret = _t.Insert(make_pair(key, V()));
return ret.first->second;//省略了一个-》
}
private:
RBTree<K, pair<const K, V>, MapKeyOfT> _t;//使用模板显式的声明使用的类型
};
template<class K, class T, class KeyOfT>
class RBTree
{
typedef RBTreeNode<T> Node; ....//T类型的节点
public:
typedef RBTreeIterator<T, T&, T*> iterator; .....
typedef RBTreeIterator<T, const T&, const T*> const_iterator;
iterator begin()
{
Node* left = _root;
while (left && left->_left)
{
left = left->_left;
}
//return left;
return iterator(left);
}
iterator end()
{
return iterator(nullptr);
}
RBTree()
:_root(nullptr)
{}
....
Node* Find(const K& key);
//插入
pair<iterator, bool> Insert(const T& data)
{
if (_root == nullptr)
{
......
return make_pair(iterator(_root), true);
}
Node* parent = nullptr;
Node* cur = _root;
KeyOfT kot; /仿函数使用场景
while (cur)
{
.......
if (kot(cur->_data) < kot(data))
{
parent = cur;
cur = cur->_right;
}
else if (kot(cur->_data) > kot(data))
{
parent = cur;
cur = cur->_left;
}
else
{
return make_pair(iterator(cur), false);
}
}
// 新增节点,颜色是红色,可能破坏规则3,产生连续红色节点
cur = new Node(data);
Node* newnode = cur; //便于返回迭代器...
cur->_col = RED;
........
_root->_col = BLACK;
return make_pair(iterator(newnode), true);
}
template < class K>
class set
{
struct SetKeyOfT
{
const K& operator()(const K& key)
{
return key;
}
};
public:
typedef typename RBTree<K, K, SetKeyOfT>::iterator iterator;
iterator begin()
{
return _t.begin();
}
iterator end()
{
return _t.end();
}
pair<iterator, bool> insert(const K& key)
{
return _t.Insert(key);
}
private:
RBTree<K, K, SetKeyOfT> _t;
};
----仿函数使用场景..
KeyOfT kot;
while (cur)
{
if (kot(cur->_data) < kot(data))
{
parent = cur;
cur = cur->_right;
}
else if (kot(cur->_data) > kot(data))
{
parent = cur;
cur = cur->_left;
}
....
现在一只半截的buff,迟早凉凉…该哈希了…