map和set的封装用红黑树

1.iterator迭代器

迭代器。迭代器的作用——容器的类型有很多种但是不是每一个容器的取值方式都是一样的。比如说list是箭头->和解引用*的方式,string则是通过方括号的方式访问的。所以为了统一的访问这些容器所以我们就设置出了迭代器。统一用一种方式这里是,箭头->和解引用*的方式。迭代器里面就是存一个节点或一个数据的指针,通过一些运算符重载方式进行统一。所以我们可以理解迭代器成“指针”,但是迭代器本质还是一个类。我们用模版去实现。

template<class T,class Ref,class Ptr>//Ref是引用,Ptr是指针
struct RBTreeiterator//我们将红黑树的迭代器命名成RBTreeiterator
{

};

第一个参数T是RBNode中的唯一模版参数,传进来是为了在迭代器中有效储存数据。因为我们需要再迭代器中存一个“数据”的指针(这个数据可以是某个节点也可以是某个内置类型)。第二个参数代表T类型的引用,Ptr代表T类型的指针。

首先我们需要储存数据的指针。 RBNode<T>*  _node;

​

template<class T,class Ref,class Ptr>//Ref是引用,Ptr是指针
struct RBTreeiterator//迭代器就是来实现数据与数据之间的操作的。与数据的类分开了
{

    typedef RBNode<T> Node;
    typedef RBTreeiterator<T,Ref,Ptr> Self;//这里重命名的原因是如果下次修改时,只需要修改这一个                    地方了。方便维修。
    Node* _node;
    Node* _root;
};

​

然后就是写迭代器会有的操作,我们可以将迭代器比作指针,或者换一句话说就是数据本身的指针,那么我们通过类的运算符重载,它应该会有这些操作operator*(),operator->(),operatpr++(),operator--(),operator!=(),operator==()等等操作。_root是方便--的操作,在operator--中会有说明。

template<class T,class Ref,class Ptr>/
struct RBTreeiterator
{
    
    typedef RBNode<T> Node;
    typedef RBTreeiterator<T,Ref,Ptr> Self;
          
    Node* _node;

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

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

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

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

这些操作都比较基础,主要是operator++和operator--有点棘手。我们先来分析operator++。

operator++()

我们在拿到这个节点的迭代器后我们++应该指向哪一个节点呢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值