《STL源码剖析》chapter5 关联式容器set与map

关联式容器set

set底层采用RB-tree实现,其键值就是实值,实值就是键值。

同时,我们不可以通过set的迭代器改变set的元素值,因为set元素值就是其键值,关系到set元素的排列规则。在set的源代码中,set<T>::iterator被定义为底层RB-treeconst_iterator,杜绝写入操作。

标准的STL set使用RB-tree作为底层机制,其所开放的各种操作接口都只是转调用RB-tree的操作行为。

set不允许两个元素有相同的键值,所以其insert操作调用的是底层RB-treeinsert_unique()操作。

相比于set,multiset运行两个元素有相同的键值,因此它的插入操作采用的是底层机制RB-treeinsert_equal()

实现的部分set代码可以参考github

关联式容器map

map的底层机制同样是RB-tree,其所有元素都是pair,同时拥有实值(value)和键值(key),其中pair的第一元素被视为键值,第二元素被视为实值。同set一样,map也不允许两个元素拥有相同的键值。

map的部分定义如下:

template<class Key,class T,class Compare=wj::less<Key>>
class map{
    public:
        //typedefs
        typedef Key key_type;   //键值类别
        typedef T data_type;    //数据类别
        typedef T mapped_type;
        typedef wj::pair<const Key,T> value_type;   //元素类型
        typedef Compare key_compare;    //键值比较函数

    //...

    private:
        typedef wj::rb_tree<key_type,value_type,wj::select1st<value_type>,key_compare> rep_type;
        rep_type t;     //以红黑树表现map
    public:

        //...

        //subscript operator
        T& operator[](const key_type& k){
            return (*(insert(value_type(k,T())).first)).second;
        }
        //insert
        wj::pair<iterator,bool> insert(const value_type& x){
            //返回pair
            return t.insert_unique(x);
        }
        //find
        iterator find(const key_type& x) { return t.find(x); }
};

从上述代码可以看出,mappair声明为value_type。同时在insert操作中采用RB-treeinsert_unique()操作。

特别需要注意的是下标运算符,map的下标运算符是通过插入一个value_type(k,T())的临时元素来执行的,所以如果进行下标运算,输入的键值不存在,map会插入一个新元素,若键值存在,则会返回一个其实值(value)引用。

相比于mapmultimap允许两个元素键值相同,所以其调用底层RB-treeinsert_equal()实现其插入操作。

部分map代码可以参考github

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值