C++判断两个序列的包含关系: std::includes
2015-08-14 09:46
176 查看
C++判断两个序列的包含关系: std::includes
std::includes用于判断序列S2是否包含于序列S1,前提是序列S1,S2必须为有序序列(若为无序序列,首先应该通过std::sort使其变为有序序列),返回false(不包含)或者true(包含)。但是该功能并要求序列S2中的元素在序列S1中仍然连续出现,只是用来判断序列S1是否包含S2中的所有元素(不要求连续),并不类似于字符串判断中的子序列函数strstr。判断两个元素是否相等,需要以less和greater为判断依据,因此配合着两个有序序列S1、S2的排序方式(递增或递减),includes算法可以供用户选择less或者greater进行两个元素的大小比较。若S1、S2为递增数列,includes函数应该以如下方式使用:
includes(S1.begin(),S1.end(),S2.begin(),S2.end());
和如下代码完全相同(默认为less比较)
includes(S1.begin(),S1.end(),S2.begin(),S2.end(),less<int>());
但是如果S1和S2是递增数列,includes函数应该以如下方式使用:
includes(S1.begin(),S1.end(),S2.begin(),S2.end(),greater<int>());
如果S1或S2中的元素可以重复,那么“S1中包含S2”的定义:假设某元素在S2中出现n次,在S1中出现m次,如果m
template<class InputIterator1,class InputIterator2> bool includes(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2) { while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作 { if (*first2<*first1) //说明,first1前面没有小于等于first2的元素,包含情况肯定不成立(有序序列) return false; else if (*first1<*first2)//序列二的相关元素大于 //序列一,序列一前进 first1++; else //若二者相同,两序列各自前进1 { first1++; first2++; } } return first2==first1; //有一个序列走完了,判断最后一关 }
版本二:自定义比较算子
template<class InputIterator1,class InputIterator2,class OutputIterator,classs Compare> bool includes(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,Compare comp) { while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作 { if (comp(*first2,*first1)) //说明,comp(S2元素,S1元素)为真,包含情况肯定不成立(有序序列) return false; else if (comp(*first1,*first2)) //comp(S1元素,S2元素)为真,序列一前进 first1++; else //若二者相同,两序列各自前进1 { first1++; first2++; } } return first2==first1; //有一个序列走完了,判断最后一关 }
示例(less比较符):
int main(void) { int iarr1[]={1,10,5,7,19,4,9,1}; int iarr2[]={1,19,7}; std::sort(std::begin(iarr1),std::end(iarr1)); std::sort(std::begin(iarr2),std::end(iarr2)); bool ret; ret=includes(std::begin(iarr1),std::end(iarr1), std::begin(iarr2),std::end(iarr2), less<int>()); //ret为true return 0; }
示例(greater比较符):
int main(void) { int iarr1[]={1,10,5,7,19,4,9,1}; int iarr2[]={1,19,7}; std::sort(std::begin(iarr1),std::end(iarr1),greater<int>()); std::sort(std::begin(iarr2),std::end(iarr2),greater<int>()); bool ret; ret=includes(std::begin(iarr1),std::end(iarr1), std::begin(iarr2),std::end(iarr2), greater<int>()); //ret为true return 0; }
相关文章推荐
- VS2010,C语言编程调用函数sqrt
- C++模板学习
- 深入理解C++对象模型-对象的内存布局,vptr,vtable
- OC语言-05-OC语言-内存管理
- VC++中窄字节、宽字节的由来
- C语言文件读写例题,fgetc,fputc,fgets,fputs,fread,fwrite,fscanf,fprintf
- C语言正确使用extern关键字
- 几种图形打印基于C++IO流操作
- C语言的局部变量和外部变量
- 如何快速将vc++的类转换为c#/cli
- 黑马程序员—-C语言入门十重奏之六相濡以沫
- 类型转换
- 黑马程序员—-C语言入门十重奏之五相熟
- 【C语言经典实例】-直接插入排序
- 每天一套题系列之C语言(一)
- 初学算法-基于最小堆的优先级队列C++实现
- C/C++中const关键字详解
- C++关键字this
- C语言关键---sizeof
- C语言关键---static