C++集合操作之集合差集:std::set_difference
2015-08-13 12:01
591 查看
C++集合操作之集合并集:std::set_difference
算法set_difference可以用来求两个集合的差集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_difference要求两个区间必须是有序的(从小到大排列),std::set和std::multiset为有序序列,而hash_set以及hash_multiset为无序序列。算法set_difference可构造区间S1,S2的差集(出现于S1但不出现于S2的元素),即S1-S2;返回值为指向输出区间的尾端。
由于区间S1,S2内的每个元素都不需唯一,因此,如果某个值在S1中出现m次,在S2中出现n次,那么该值在输出区间中出现的次数为max(m-n,0),且全部来自S1。
set_difference为稳定操作,即输出区间内的每个元素的相对顺序都和S1内的相对顺序相同。
一定谨记:两个区间必须是有序区间(从小到大)
源代码如下:
template<class InputIterator1,class InputIterator2,class OutputIterator> OutputIterator set_difference(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result) { while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作 { //在两个区间内分别移动迭代器。当第一区间的元素等于第二区间的元素时(此值同时存在于两个区间中) //同时移动first1,first2;当第一区间元素大于第二区间元素时,只让第二区间前进; //前两种情况的处理保证了当第一区间元素小于第二区间元素时,第一区间的元素只存在于第一区间,而不存在于第二区间;于是将该值记录,并且移动result if (*first1<*first2) { *result=*first1; //既然走到这一步,说明first2前的元素没有与first1所指元素相同的元素(有序区间的特性) first1++; result++; } else if (*first2<*first1) first2++; else { first1++; first2++; } } return copy(first1,last1,result); }
示例:
int main(void) { int iarr1[]={1,2,3,3,4,5,6,7}; int iarr2[]={1,4,3,9,10}; multiset<int> iset1(begin(iarr1),end(iarr1)); multiset<int> iset2(begin(iarr2),end(iarr2)); vector<int> ivec(10); auto iter=set_difference(iset1.begin(),iset1.end(),iset2.begin(),iset2.end(),ivec.begin()); //ivec为:2,3,5,6,7 ivec.resize(iter-ivec.begin());//重新确定ivec大小 return 0; }
其实 ,上述代码并不仅限于对两个集合求差集,只要是两个有序区间,均可以用此代码求差集。
用于非set场合:
int main(void) { int iarr1[]={1,2,3,3,6,7,4,5}; int iarr2[]={1,4,3,10,9}; std::sort(begin(iarr1),end(iarr1)); std::sort(begin(iarr2),end(iarr2)); vector<int> ivec(10); auto iter=set_difference(begin(iarr1),end(iarr1),begin(iarr2),end(iarr2),ivec.begin()); //ivec为:2,3,5,6,7 ivec.resize(iter-ivec.begin());//重新确定ivec大小 return 0; }
相关文章推荐
- c++,初始化列表
- Windows/MFC,C++中的TCHAR体系/char体系/WCHAR体系及其相互转换
- GNU C 、ANSI C、标准C、标准c++区别和联系
- Windows/C++/MFC_ATL转换宏用于WCHAR,TCHAR,char转换以及其含义
- 星系模拟器开发日志(一) 如何科学地用C++画图
- c++ cout 格式化输出浮点数、整数及格方法
- C++的Public.lib(Public.dll) : fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'
- 浅谈C/C++内存泄漏及其检测工具
- Bit Manipulation - Number of 1 Bits
- Duanxx的C++学习: 使用类没有被定义 原因及解决方法
- C++集合操作之集合并集:std::set_union
- C语言中的signal函数
- C++是怎么实现多态性的
- C++ 对象动态建立与释放
- 使用sublime text 3 搭建轻量级C/C++编译器
- C/C++之static函数与普通函数
- C/C++之宏、内联函数和普通函数的区别
- C/C++之单例模式实现
- C/C++之标准库和标准模板库
- C/C++之全局、static对象/变量的初始化问题