C++ STL(第二十一篇:算法-- 应用于有序区间的算法)

本文介绍了C++ STL中应用于有序区间的算法,包括includes、merge、lower_bound、upper_bound、binary_search、equal_range和inplace_merge。详细阐述了每个算法的功能、应用场景和实现原理,帮助理解如何在有序序列中进行高效操作。
摘要由CSDN通过智能技术生成

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;			//令 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值