C++集合操作之集合交集:std::set_intersection
来源:互联网 发布:易赛软件 编辑:程序博客网 时间:2024/06/06 07:23
C++集合操作之集合交集:std::set_intersection
算法set_intersection可以用来求两个集合的交集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_intersection要求两个区间必须是有序的(从小到大排列),std::set和std::multiset为有序序列,而hash_set以及hash_multiset为无序序列。
由于两个集合内的每个元素都不需唯一,因此,如果某个值在区间1中出现m次,在区间2中出现n次,那么该值在输出区间中会出现min(m,n)次,且全部来自于区间1.函数返回值为一个迭代器,指向输出区间的尾部。
set_intersection为稳定操作,即输出区间内的每个元素的相对顺序都和区间1内的相对顺序相同。
一定谨记:两个区间必须是有序区间(从小到大)
源码如下:
template<class InputIterator1,class InputIterator2,class OutputIterator>OutputIterator set_intersection(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result){while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作{//在两个区间内分别移动迭代器。若二者值相同用result记录该值,移动first1,first2和result//若first1较小,则移动first1,其他不动//若first2较小,则移动first2,其他不动if (*first1<*first2) first1++;else if (*first2<*first1)first2++;else{*result=*first1;first1++;first2++;result++;}}return result; }示例:
int main(void){int iarr1[]={1,2,3,3,4,5,6,7,9};int iarr2[]={1,4,3,9,10};multiset<int> iset1(begin(iarr1),end(iarr1));multiset<int> iset2(begin(iarr2),end(iarr2));vector<int> ivec(20); auto iter=set_intersection(iset1.begin(),iset1.end(),iset2.begin(),iset2.end(),ivec.begin());//ivec为:1,3,4,9ivec.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_intersection(begin(iarr1),end(iarr1),begin(iarr2),end(iarr2),ivec.begin());//ivec为:1,2,4,9ivec.resize(iter-ivec.begin());//重新确定ivec大小return 0;}
0 0
- C++集合操作之集合交集:std::set_intersection
- C++集合操作之集合交集:std::set_intersection
- vector set_union() /set_intersection【集合合并/交集】
- HANA集合操作之INTERSECT交集操作
- C++集合操作之集合并集:std::set_union
- C++集合操作之集合差集:std::set_difference
- C++集合操作之集合对称差集:std::set_symmetric_difference
- std::set_intersection
- C语言:计算两个集合的交集
- 集合之Stream操作集合
- Oracle-27-集合操作(交集、并集、差集)&子查询之单行子查询
- C语言数据结构之求两个集合的交集(链表)
- 16.c++-std::Set(有序集合)
- 集合的交集
- 集合求交集问题
- java 集合 交集
- 求集合的交集
- 单链表集合求交集
- 作为码农,我们为什么要写作
- hashcode()的作用
- java中++i和i++是否一样
- Java中的类加载
- 启动hadoop时报错,nodemanager running as process 6410. Stop it first.解决方法
- C++集合操作之集合交集:std::set_intersection
- 建筑建模学习笔记3——Vray渲染及PS修图
- C++实现CVPR2010 LLC(局部约束线性编码)
- NYOJ 814 又见拦截导弹
- LeetCode 24 Swap Nodes in Pair
- Openstack部署工具总结
- 威佐夫博奕
- NET下RabbitMQ实践[示例篇]
- webService学习记录-02