STL源码——RB-Tree insert操作

本文详细介绍了STL中红黑树实现的关联容器如map和set的insert函数,特别是分析了insert_unique和insert_equal操作。重点讲解了带hint的插入如何提高效率,并探讨了无hint时的insert_unique函数的工作原理,包括如何找到插入位置以及处理重复键的情况。
摘要由CSDN通过智能技术生成

  看STL源码剖析时,真正的插入函数__insert(base_ptr x, base_ptr y, const value& v)时,发现参数x几乎没什么用,查了一些资料,发现x是在调用另一个insert重载函数时发挥作用的,于是整理了一下insert函数。
  STL关联容器map/multimp,set/multiset,都是使用了红黑树的底层结构。insert有两个重载函数,一个insert(const Value&),一个是insert_unique(iterator, const Value&),后者是带hint的插入。《C++标准程序库》中说道:若被安插元素位置恰好紧贴于提示位置之后,那么时间复杂度就会从“对数”变为“摊还常数”。当hint恰当时,可大大加快速度。
  对于map和set,insert函数会调用rb-tree中的insert_unique版本,对于multimap和multiset,则调用rb-tree中的insert_equal版本。由于insert_equal较insert_unique简单一些,所以这里只分析insert_unique.

template <class Key, class Val, class KeyOfValue, class Compare, class Alloc>
typename rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::iterator 
rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::insert_unique(iterator position,
                                                             const Val& v) {
  if (position.node == header->left) // begin()
    if (size() > 0 && key_compare(KeyOfValue()(v), key(position.node)))
      return __insert(position.node, position.node, v);
  // first argument just needs to be non-null 
    else
      return insert_unique(v).first;
  else if (position.node == header) // end()
    if (key_compare(key(rightmost()), KeyOfValue()(v)))
      return __insert(0, rightmost(), v);
    else
      return insert_unique(v).first;
  else {
    iterator before = position;
    --before;
    if (key_compare(key(before.node), Ke
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值