1、概述
有序区间,顾名思义就是区间内的元素都是经过排序之后的。对于这种类型的区间,有一系列的算法。今天就对这种区间的算法进行整理。
2、includes
判断序列 S2 是否 “涵盖于” 序列 S1,所谓涵盖,意思是 “S2 的每一个元素都出现于 S1”。代码如下:
template<class InputIterator1, class InputIterator2>
bool includes( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2)
{
while( first1 != last1)
{
if( *first1 < *first2)
++first1;
else if( *first2 > *first1)
return false;
else
{
++first1;
++first2;
}
}
return first2 == last2;
}
3、merge
将两个经过排序的集合 S1 和 S2,合并起来置于另一段空间中。所得结果也是一个有序序列,返回此序列的last迭代器。merge 是一个稳定操作。代码如下:
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result)
{
while( first1 != last1 && first2 != last2)
{
if( *first1 < *first2)
{
*result = *first1;
++first1;
}
else if( *first2 < *first1)
{
*result = *first2;
++first2;
}
else
{
*result = *first1;
++first1;
++first2;
}
++result;
}
copy(first1, last1, copy(first2, last2, result));
}
4、lower_bound
这是二分查找的一种版本,试图在已排序的 [first, last) 中寻找元素 value。如果 [first, last) 具有与 value 相等的元素,便返回一个迭代器,指向其中第一个元素。如果没有这样的元素存在,便返回 “假设这样的元素存在时应该出现的位置”。也就是说,它会返回一个迭代器,指向第一个 “不小于value” 的元素。如下图所示:
upper_bound 在下面整理了。
lower_bound 的代码如下:
template<class ForwardIterator, class T>
ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const T& value)
{
return __lower_bound(first, last, value, distance_type(first), inerator_category(first));
}
template<class ForwardIterator, class T, class Distance>
inline ForwardIterator __lower_bound( ForwardIterator first, ForwardIterator last, const T& value, Distance*, forward_iterator_tag)
{
Distance len = 0;
distance( first, last, len); //求取整个区间的长度 len
Distance half;
ForwardIterator middle;
while( len > 0 )
{
half = len >> 1; //除以2,位操作比较快
middle = first; //这一行和下一行是调整middle 节点
advance(middle, half);
if( *middle < value ) //如果中间位置的元素值 < 目标值
{
first = middle; //令