STL源码剖析-set容器

SGI STL中的容器set,以RB-Tree作为其底层的实现(rb_tree的大体分析见上文)。在set容器键值key和实值value是相同的,且在容器里面的元素是根据元素的键值自动排序的,同时我们不能修改set容器里面的元素值,所以set的迭代器是采用RB-Tree的const_iterator,不允许用户对其进行修改操作。

本文承接:
STL关联容器-红黑树:https://blog.youkuaiyun.com/haluoluo211/article/details/80877064

首先,给出上面的rb_tree的更详细的定义(主要给出模板Value的声明):

template<typename Key, typename Value, typename Compare>
class rb_tree1{
protected:
    typedef typename __rb_tree_node_base* base_ptr;
    // Value是rb_tree的节点值,Key用于排序
    typedef __rb_tree_node<Value> rb_tree_node;
    // 空间配置器
    typedef allocator<rb_tree_node> rb_tree_node_allocator;
};

下面看下set, map中rb_tree的使用:

在set中对于rb_tree而言key, value都是一样的,内部成员就只有一个rb_tree

template <typename Key, class Compare = std::less<Key>>
class set{
    public:
        typedef Key key_type;
        typedef Key value_type;

        typedef Compare key_compare;

    private:
        // 对于set而言,Key, Value类型是一样的
        typedef rb_tree1<key_type, value_type, key_compare> rep_type;

        // set的成员变量
        rep_type t;
};

在map中对于rb_tree而言key, value不一样,key用于rb_tree排序,pair<key, value>才是rb_tree的节点,同样成员就一个rb_tree足已表现整个map:

template <typename Key, typename Value, class Compare = std::less<Key>>
class map{
    // 用于re_tree排序
    typedef Key    key_type;
    // rb_tree节点的value
    typedef std::pair<key_type, value_type> value_type;

    typedef Compare key_compare;

    // 对于map而言,Key, Value类型不一样,一个排序,另一个节点实值
    typedef rb_tree1<key_type, value_type, key_compare> rep_type;

    // map的成员变量
    rep_type t;
};

首先看构造函数:

set():t(Compare()){}

template<typename InputIterator>
set(InputIterator first, InputIterator last):t(Compare()){
    // 直接调用rb_tree的insert_unique
    t.insert_unique(first, last);
}

其他的操作基本上也是调用rb_tree的函数.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值