工具类分析-rak::ranges

rak::ranges:

原型:template<typenameTypeclassranges: privatestd::vector<std::pair<Type, Type> >

说明:按照 从小到大的顺序,维护一个半开半闭区间里列表,如[1,3) [5,8) [11,30),

核心函数:

1. 插入区间  template <typename Type> void ranges<Type>::insert(value_type r);

/************************************************************************/
/*insert 分类,当前状态                       [5,10)              [18,20) [23,30)
1. 头  [1,3)            插入后           [1,3) [5,10)              [18,20) [23,30)
2. 尾  [35,40)        插入后                    [5,10)              [18,20) [23,30) [35,40)
3. 中间[11,13)       插入后                    [5,10) [11,13] [18,20) [23,30) 
4. 融合[1,5)           插入后           [1,           10)              [18,20) [23,30)   
5. 融合[10,19)       插入后                    [5,                          20) [23,30)
6. 融合[1,35)         插入后           [1                                                        35)
/************************************************************************/
template<typenameType>void ranges<Type>::insert(value_type r) {
  if(r.first>= r.second)
    return;

  iterator first= std::find_if(begin(), end(), rak::less_equal(r.first, rak::const_mem_ref(&value_type::second)));

  if(first== end() || r.second< first->first) {
    //对应1,2,3
  
base_type::insert(first, r);

  } else{
        //调整first位置合并first和r ,对应 5,6
  
first->first= std::min(r.first, first->first);
    first->second= std::max(r.second, first->second);
       
    iterator last= std::find_if(first, end(), rak::less(first->second, rak::const_mem_ref(&value_type::second)));
        //调整first位置,合并first和last
  
if(last!= end() && first->second>= last->first)
      first->second= (last++)->second;//对应5

  
base_type::erase(first+ 1, last);
  }
}


2. 删除区间 template<typenameType> void ranges<Type>::erase(value_type r)
/************************************************************************/
/*erase 分类,当前状态                  [5,10)         [18,20) [23,30)
1. 同一区间    [5,6)          移除后       [6,10)        [18,20) [23,30)
2. 同一区间    [7,8)          移除后      [5,7) [8,10)[18,20) [23,30)
3. 同一区间    [7,10)        移除后      [5,7)           [18,20) [23,30)
4. 不同区间    [6,19)        移除后      [6,10)          [19,20)[23,30)
/************************************************************************/
template<typenameType> void ranges<Type>::erase(value_type r) {
  if(r.first>= r.second)
    return;
    //找到r 所在的区间
 
iterator first= std::find_if(begin(), end(), rak::less(r.first, rak::const_mem_ref(&value_type::second)));
  iterator last = std::find_if(first, end(), rak::less(r.second, rak::const_mem_ref(&value_type::second)));

  if(first== end())
    return;
    //在同一区间内
 
if(first== last) {
        //在同一区间中间,分开成两个区间
  
if(r.first> first->first) {//对应 2,3
    
std::swap(first->first, r.second);
      base_type::insert(first, value_type(r.second, r.first));

    } else if(r.second> first->first) {//对应 1.
    
first->first= r.second;
    }

  } else{
   //调整first的second  对应4
  
if(r.first> first->first)
      (first++)->second= r.first;
    //调整last的first  对应4
  
if(last!= end() && r.second> last->first)
      last->first= r.second;

    base_type::erase(first, last);
  }
}

3. 检查index是否在区间 
template <typename Type> bool ranges<Type>::has(Type index) const {
  const_iterator itr = find(index);

  return itr != end() && index >= itr->first;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值