C++集合操作之集合差集:std::set_difference
来源:互联网 发布:mysql索引 编辑:程序博客网 时间:2024/05/20 19:19
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;当第一区间元素大于第二区间元素时,只让第二区间前进;//前两种情况的处理保证了当第一区间元素小于第二区间元素时,第一区间的元素只存在于第一区间,而不存在于第二区间;于是将该值记录,并且移动resultif (*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,7ivec.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,7ivec.resize(iter-ivec.begin());//重新确定ivec大小return 0;}
0 0
- C++集合操作之集合差集:std::set_difference
- C++集合操作之集合对称差集:std::set_symmetric_difference
- C++集合操作之集合并集:std::set_union
- C++集合操作之集合交集:std::set_intersection
- C++集合操作之集合交集:std::set_intersection
- 集合操作-差
- 集合的求差集,用set_difference(...)
- 集合差集算法
- 集合的差集
- Oracle-27-集合操作(交集、并集、差集)&子查询之单行子查询
- 数据结构:求集合差集(c/c++)
- 集合类(并集、交集、差集操作)
- java guava 集合的操作:交集、差集、并集
- 集合之Stream操作集合
- 16.c++-std::Set(有序集合)
- 顺序表集合的交并差操作
- ORACLE 数据查询集合即:查询结果的集合操作 并集 交集 差集
- python-set()集合操作(创建、添加、删除、交集、并集、差集、对称差集)
- 编译防火墙——C++的Pimpl惯用法解析
- Notepad++插件emmet快速写html笔记
- Android内存机制分析上篇:了解Android堆和栈
- Android QQ第三方登录(二)
- 魔方玩法入门
- C++集合操作之集合差集:std::set_difference
- linux network stats (cat /proc/net/dev)
- oracle 性能优化建议小结
- 杭电 1102 Constructing Roads 【最小生成树&&Kruskal】
- ios x264编译问题 No working C compiler found
- Android内存机制分析下篇:分析APP内存使用情况
- 用eclipse把h5打包成安卓apk
- Core Location初心者
- 数据结构预算法C++描述( 一)引论