set和map的底层实现

set和map的底层都是红黑树,这里需要对set 和 map中封装一颗红黑树即可。

先模拟实现实现红黑树的迭代器
节点:

template < class T>
struct RBTreeNode
{
	RBTreeNode<T>* _left;
	RBTreeNode<T>* _right;
	RBTreeNode<T>* _parent;

	Color _color;
	T _data;        //这里唯一需要差别的是_data, 对于set传过来是key,而map是键值对pair<>

	RBTreeNode(const T& x)
		:_left(nullptr)
		,_right(nullptr)
		,_parent(nullptr)
		,_color(RED)
		,_data(x)
	{}
};

对于树的迭代器

// <T,T& , T*>
template<class T, class Ref,class Ptr>
struct _Tree_iterator
{
	    typedef RBTreeNode<T> Node;
		typedef _Tree_iterator<T, Ref, Ptr> Self;

	Node* _node;

	_Tree_iterator(Node* node)
		:_node(node)
	{}

	Ref operator*()
	{
		return _node->_data;
	}

	Ptr operator->()
	{
		return &_node->_data;
	}

	bool operator!=(const Self& s) const
	{
		return s._node != _node;
	}

	bool operator==(const Self& s) const
	{
		return s._node == _node;
	}

	//中序遍历 左  根 右
	Self& operator++()
	{
		if (_node->_right)
		{
			Node* left = _node->_right;
			while (left->_left)
			{
				left = left->_left;
			}
			_node = left;
		}
		else
		{
			Node* cur = _node;
			Node* parent = cur->_parent;

			while (parent && parent->_right == cur)
			{
				cur = cur->_parent;
				parent = parent->_parent;
			}
			_node = parent;
		}
		return *this;
	}

	//反着走  右 左 根
	Self& operator--()
	{
		if (_node->_left)
		{
			Node* right = _node->_left;
			while (right->_right)
			{
				right = right->_right;
			}
			_node = right;
		}
		else
		{
			Node* cur = _node;
			Node* parent = cur->_parent;
			while (parent && parent->_left == cur)
			{
				cur = cur->_parent;
				parent->_parent;
			}
			_node = parent;
		}
		return *this;
	}
};

树是如何访问key的呢?(部分代码)

template <class K, class T,class keyofT>
class RBTree
{
	typedef RBTreeNode<T> Node;
public:
	RBTree()
		:_root(nullptr)
	{}

	typedef _Tree_iterator< T, T&, T* > iterator;

	iterator begin()  //  左  根  右
	{
		Node* left = _root;
		while (left && left->_left)
		{
			left = left->_left;
		}

		return iterator(left);
	}

	iterator end()
	{
		return iterator(nullptr);
	}


	pair<Node*, bool> Insert(const T& data)
	{
		if (_root == nullptr)
		{
			_root = new Node(data);
			_root->_color = BLACK;
			return pair<Node*, bool>(_root, true);
		}

		keyofT kot;

		Node* cur = _root, * parent = _root;
		while (cur)
		{
			if (kot(data) > kot(cur->_data))  //通过仿函数去获取各自的key
			

set的实现细节

#include"RBTree.h"

namespace chen
{
	template<class K>
	class set
	{
		struct SetofT
		{
			const K& operator()(const K& key)
			{
				return key;
			}
		};

	public:
		typedef typename RBTree<K, K, SetofT>::iterator iterator;


		iterator begin()
		{
			return _t.begin();
		}

		iterator end()
		{
			return _t.end();
		}

		pair<iterator, bool> Insert(const K& data)
		{
		      return _t.Insert(data);
		}

	private:
		RBTree<K, K, SetofT> _t;
	};
}

map的实现细节

namespace chen
{
	template<class K, class T>
	class map
	{
		struct Mapofkey
		{
			const K& operator()(const pair<K, T>& kv)
			{
				return kv.first;
			}
		};

	public:
        typedef typename RBTree<K, pair<K, T>, Mapofkey>::iterator iterator;
		iterator begin()
		{
			return _t.begin();
		}

		iterator end()
		{
			return _t.end();
		}

		pair<iterator, bool> Insert(const pair<K, T>& kv)
		{
			return _t.Insert(kv);
		}
	


	private:
		RBTree<K, pair<K, T>, Mapofkey> _t;
	};

}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通过全部用例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值