C++集合操作之集合对称差集:std::set_symmetric_difference
来源:互联网 发布:ios代理ip软件 编辑:程序博客网 时间:2024/05/20 18:49
C++集合操作之集合对称并集:std::set_symmetric_difference
算法std::set_symmetric_difference可以用来求两个集合的对称差集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为std::set_symmetric_difference要求两个区间必须是有序的(从小到大排列),std::set和std::multiset为有序序列,而hash_set以及hash_multiset为无序序列。
算法std::set_symmetric_difference可构造区间S1,S2的对称差集(出现于S1但不出现于S2的元素以及出现于S2但不出现于S1的元素);返回值为指向输出区间的尾端。
由于区间S1,S2内的每个元素都不需唯一,因此,如果某个值在S1中出现m次,在S2中出现n次,那么该值在输出区间中出现的次数为|m-n|.如果m>n,则输出区间的m-n个元素均为均由S1复制而来。否则由S2复制而来。
std::set_symmetric_difference为稳定操作,即输出区间内的每个元素的相对顺序都和S1内的相对顺序相同。
一定谨记:两个区间必须是有序区间(从小到大)
源代码如下:(原理参考:set_difference)
template<class InputIterator1,class InputIterator2,class OutputIterator>OutputIterator set_symmetric_difference(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){*result=*first1;first1++;result++;}else if (*first2<*first1){*result=*first2;first2++;result++;}else{first1++;first2++;}}return copy(first2,last2,copy(first1,last1,result)); }示例:
int main(void){int iarr1[]={1,3,5,7,9,11};int iarr2[]={1,1,2,3,5,8,13};multiset<int> iset1(begin(iarr1),end(iarr1));multiset<int> iset2(begin(iarr2),end(iarr2));vector<int> ivec(20); auto iter=set_symmetric_difference(iset1.begin(),iset1.end(),iset2.begin(),iset2.end(),ivec.begin());//ivec为:1,2,7,8,9,11,13ivec.resize(iter-ivec.begin());//重新确定ivec大小return 0;}
其实 ,上述代码并不仅限于对两个集合求对称差集,只要是两个有序区间,均可以用此代码求对称差集。
用于非set场合:
int main(void){int iarr1[]={1,3,5,7,9,11};int iarr2[]={1,1,2,3,5,8,13};std::sort(begin(iarr1),end(iarr1));std::sort(begin(iarr2),end(iarr2));vector<int> ivec(10); auto iter=set_symmetric_difference(begin(iarr1),end(iarr1),begin(iarr2),end(iarr2),ivec.begin());//ivec为:1,2,7,8,9,11,13ivec.resize(iter-ivec.begin());//重新确定ivec大小return 0;}
0 0
- C++集合操作之集合对称差集:std::set_symmetric_difference
- C++集合操作之集合差集:std::set_difference
- C++集合操作之集合并集:std::set_union
- python-set()集合操作(创建、添加、删除、交集、并集、差集、对称差集)
- C语言 集合运算 并、交,相对补,对称差,判断两个集合是否相等,求集合幂集
- C++集合操作之集合交集:std::set_intersection
- C++集合操作之集合交集:std::set_intersection
- 集合操作-差
- C语言 集合运算 并、交,相对补,对称差,判断两个集合是否相等,求集合幂集(改进幂集)
- java求集合的并集、交集、补集、差集和对称差集
- 集合中的(交集,并集,差集,补集,对称差集)
- bash技巧:求集合的交集、并集、差集、对称差集
- python set集合运算(交集,并集,差集,对称差集)
- STL 算法vector/set集合-交集,并集,差集,对称差
- <C++ STL set>集合并,交,差,对称差总结
- 集合差集算法
- 集合的差集
- Oracle-27-集合操作(交集、并集、差集)&子查询之单行子查询
- KMP简单应用
- 提高web和图形设计人员水平的27个漂亮UI套件
- NYOJ --25--A Famous Music Composer
- wireless tools笔记
- Hdu oj 1021 Fibonacci Again
- C++集合操作之集合对称差集:std::set_symmetric_difference
- PHP学习总结(四)
- uboot学习笔记
- 整形数组合并_用 set
- nyoj38 布线问题
- Find The Multiple(POJ--1426
- linux安装vmware tools 找不到kernel路径
- Vijos1909 寻找道路
- js获取各种浏览器宽度