rak::ranges:
原型:template<typenameType> classranges: 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; }