C++集合操作之集合并集:std::set_union
来源:互联网 发布:抗战 知乎 编辑:程序博客网 时间:2024/06/12 20:36
C++集合操作之集合并集:std::set_union
算法set_union可以用来求两个集合的并集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_union要求两个区间必须是有序的(从小到大排列),std::set和std::multiset为有序序列,而hash_set以及hash_multiset为无序序列。
由于两个集合内的每个元素都不需唯一,因此,如果某个值在区间1中出现m次,在区间2中出现n次,那么该值在输出区间中会出现min(m,n)次,且全部来自于区间1.函数返回值为一个迭代器,指向输出区间的尾部。
一定谨记:两个区间必须是有序区间(从小到大)
源码如下:
template<class InputIterator1,class InputIterator2,class OutputIterator>OutputIterator set_union1(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result){while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作{//在两个区间内分别移动迭代器。首先将元素较小者(假设为first1)记录在目标result中//移动first1,使其前进,同时保持first2不动,移动result//继续进行大小比较:如果first1较大,记录*first2,移动first2;如果二者值相等,记录*first1,移动first1,first2//重复这个过程if (*first1<*first2) {*result=*first1;first1++;}else if (*first2<*first1){*result=*first2;first2++;}else{*result=*first1;first1++;first2++;}result++;}//如果有一个区间到达尾端,那么结束while循环,将未到达尾端的区间中尚未操作的元素复制result中//如果区间1比较长,那么此时first2==last2,此时相当于区间1中未复制的元素[first1,last1)复制到以result开头的区间中,return语句相当于return copy(first1,last1,result)//如果区间2比较长,那么此时first1==last1,此时相当于区间1中未复制的元素[first2,last2)复制到以result开头的区间中,return语句相当于return copy(first2,last2,result)return copy(first2,last2,copy(first1,last1,result)); //可将return 语句改写如下:/*if(first1==last1)return copy(first2,last2,result);else if (first2==last2)return copy(first1,last1,result);*/}
测试代码:
int main(void){int iarr1[]={1,2,3,3,4,5,6,7};int iarr2[]={1,4,3,3,3,7,8,9,10};multiset<int> iset1(begin(iarr1),end(iarr1));multiset<int> iset2(begin(iarr2),end(iarr2));vector<int> ivec(20); auto iter=set_union(iset1.begin(),iset1.end(),iset2.begin(),iset2.end(),ivec.begin());//ivec为:1,2,3,3,3,4,5,6,7,8,9,10ivec.resize(iter-ivec.begin());//重新确定ivec大小return 0;}
其实 ,上述代码并不仅限于对两个集合求并集,只要是两个有序区间,均可以用此代码求并集。
代码如下:
int main(void){int iarr1[]={1,2,3,3,4,5,6,7};int iarr2[]={1,4,3,3,3,7,8,9,10};std::sort(begin(iarr1),end(iarr1));std::sort(begin(iarr2),end(iarr2));vector<int> ivec(20); auto iter=set_union(begin(iarr1),end(iarr1),begin(iarr2),end(iarr2),ivec.begin());//ivec为:1,2,3,3,3,4,5,6,7,8,9,10ivec.resize(iter-ivec.begin());//重新确定ivec大小return 0;}
0 0
- C++集合操作之集合并集:std::set_union
- C++集合操作之集合差集:std::set_difference
- C++集合操作之集合对称差集:std::set_symmetric_difference
- C++集合操作之集合交集:std::set_intersection
- C++集合操作之集合交集:std::set_intersection
- C语言详解 之 集合的并
- 集合操作-并
- vector set_union() /set_intersection【集合合并/交集】
- 集合之Stream操作集合
- 16.c++-std::Set(有序集合)
- C++:set_union is not a member of std;
- Oracle之集合操作
- 集合之--LinkedList操作
- 集合之--ArrayList操作
- Oracle-27-集合操作(交集、并集、差集)&子查询之单行子查询
- 泛型算法:有序集合set_union和set_intersection
- C++集合运算函数总结-merge、set_union、set_difference、set_symmetric_difference、set_intersection
- 有序集合并集
- activemq配置详解
- Codeforces Round #200 (Div. 2)344D Alternating Current(栈)
- Climbing Stairs
- file样式化
- 浅谈xunsearch、mysql使用及错误总结
- C++集合操作之集合并集:std::set_union
- 网络编程复习_Exp1
- Unity3D之协程(Coroutines & Yield )
- 【傻傻分不清楚】 一 Get和Post
- mysql 新建用户并赋予权限
- 惠州代办医院诊断证明
- HDU 5373
- 梅州代办医院诊断证明
- C++中使用反射动态加载和卸载DLL