欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++includes函数详解

程序员文章站 2022-05-24 23:45:22
...

C++includes函数详解
includes函数是algorithm中的库函数。includes函数是判断一个升序数组是否被另一个升序数组包含。也是个求是否为子序列问题。
例如:arr1=[1,2,3,4],arr2=[2,3],则数组arr1包含数组arr2,arr2是arr1的子序列,若arr2=[2,5],则数组arr1不包含数组arr2,arr2不是arr1的子序列。
     注意:前提是这两个数组都是升序排列的!才能用includes函数。
first1和last1是包含数组的起始地址和尾地址,first2和last2是被包含数组的起始地址和尾地址
函数原型如下:

template <class InputIterator1, class InputIterator2>
bool includes ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2 )
{    while (first2!=last2)  
	{    if ( (first1==last1) || (*first2<*first1) ) 
			return false;    
     	     if (!(*first1<*first2))     //可以改为*first1==*first2,如果能执行到这一行一定是*first2>=*first1
     	                ++first2;    
     	     ++first1;  
     	}  
     	return true;
}

看不懂上面的可以看下面的代码分析:
代码分析:
第3行:当first2!=last2时程序继续执行,那么当first2=last2时,说明first2已经走完了整个数组。程序结束。得出结论first1包含first2。
第4行if ( (first1==last1) || (*first2<*first1) ) ,当first1=last1时,说明first1已经走完整个数组,还没有找出子序列(第3行控制的循环体还在循环)。得出结论:不包含。false,如果感觉思路还不是特别清楚可以往下看。
*first2<*first1为什么*first1大于*first2就能直接得出不包含关系呢?
原因是这样的,因为两个数组都是升序排列,*first1后面的元素一定比*first1大,就算*first2以后的元素和*first1以后的元素都相同,但是*first1和*first2不相同啊,就导致first2不是first1的子序列。
还不懂的可以举个例子:
*first1:3 4 6 8 9     //升序排列,越往后越大
*first2:2 4 6 8 9     //2和3不同导致以后的就不用比了,first2一定不是first1的子序列。得出结论false。
第6行 if (!(*first1<*first2) )当*first1>=*first2时为真,如果能执行到这里一定是不满足第4行的*first2<*first1得出*first2>=*first1
联立:*first2>=*first1
           *first1>=*first2 得出如果条件为真必须满足*first1=*first2,所以源代码可以替换为if( *first1==*first2 )
代码还剩++first2; 和 ++first1;用举例子讲解容易懂。
C++includes函数详解
以上程序需要多花时间好好理解。