标准库的<algorithm>头文件中提供了std::set_difference,std::set_intersectionstd::set_union用来求两个集合的差集,交集和并集。

正好有个需求,需要求在实体类集合A中,但是不再实体类集合B中的元素,可以使用上述方法来实现。

首先,来看下上述几个方法的简单使用。

    std::vector<int> v1{ 1,2,3,4,5,6,7,8 };
std::vector<int> v2{ 5, 7, 9,10 };
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end()); std::vector<int> v_intersection; std::set_intersection(v1.begin(), v1.end(),
v2.begin(), v2.end(),
std::back_inserter(v_intersection));
for (int n : v_intersection)
std::cout << n << ' '; std::vector<int> v_difference; // v2 中有,v1中没有
set_difference(v1.begin(), v1.end(), v_intersection.begin(), v_intersection.end(), inserter(v_difference, v_difference.begin())); cout << endl;
for (int n : v_difference)
cout << n << " ";
cout << endl;

声明两个vector<int>set_*方法需要集合是有序的,先调用sort方法排序。后面的使用就比较简单了,调用set_intersection传入两个集合的要进行交操作的区间,back_inserter将两个集合的交集插入到v_intersection中。

调用set_difference查找在集合v1中有,而v1v2中交集没有的元素。

最后的输出结果如下:

5 7
1 2 3 4 6 8

自定义类型

上面的例子使用的是int,在实际应用中,通常需要的自定义的类型。 如下:

struct Item {
string group;
string md5; Item(const string &g, const string &m) {
group = g;
md5 = m;
} bool operator<(const Item &_I) const {
if (group == _I.group) {
return md5 < _I.md5;
} return group < _I.group;
}
};

自定义类型Item的结构很简单,只有两个字段:groupmd5。 然后重载了运算符<方便排序,排序的规则是:group不同,在按照group字段排序; 如果group相同,按照字段md5排序。

测试代码如下:

    Item i1("1", "111");
Item i2("1", "222");
Item i3("1", "333"); Item i4("2", "110");
Item i5("2", "220"); vector<Item> list;
list.push_back(i4);
list.push_back(i1);
list.push_back(i2);
list.push_back(i5);
list.push_back(i3); Item i6("3", "330");
Item i7("4", "440"); vector<Item> list1 = { i2, i4, i6, i7 }; sort(list.begin(), list.end());
sort(list1.begin(), list1.end()); cout << "list1:###" << endl;
for (auto i : list)
cout << "group:" << i.group << " md5:" << i.md5 << endl; cout << "list2:###" << endl;
for(auto i : list1)
cout << "group:" << i.group << " md5:" << i.md5 << endl; vector<Item> item_intersection;
set_intersection(list.begin(), list.end(), list1.begin(), list1.end(), back_inserter(item_intersection)); cout << "list1 和 list2 的交集: ###" << endl;
for(auto i : item_intersection)
cout << "group:" << i.group << " md5:" << i.md5 << endl; vector<Item> item_difference;
set_difference(list.begin(), list.end(), item_intersection.begin(), item_intersection.end(), back_inserter(item_difference));
cout << "list1中有,而list2中没有的元素:###" << endl;
for(auto i : item_difference)
cout << "group:" << i.group << " md5:" << i.md5 << endl;

最终的输出结果:

总结

并集(http://zh.cppreference.com/w/cpp/algorithm/set_union)

交集(http://zh.cppreference.com/w/cpp/algorithm/set_intersection)

差集(http://zh.cppreference.com/w/cpp/algorithm/set_difference)

inserter(http://zh.cppreference.com/w/cpp/iterator/inserter)

back_inserter(http://zh.cppreference.com/w/cpp/iterator/back_inserter)

上述代码中使用的几个方法详细描述。

C++求集合的交集差集的更多相关文章

  1. C# 集合的交集 差集 并集 去重

    C# 集合的交集 差集 并集 去重 两个对象list,直接比较是不行的,因为他们存的地址不一样 需要重写GetHashCode()与Equals(object obj)方法告诉电脑 class Stu ...

  2. C# 数组比较--取得两个集合的交集,差集,并集的方法

    方法关键字: 交集:Intersect 差集:Except 并集:Union 使用代码: , , , , }; , , , , }; var 交集 = arr1.Intersect(arr2).ToL ...

  3. python-->(set /dict)交集 差集 并集 补集(功能用来做交差并补的)

    # ### 集合 作用:交集 差集 并集 补集(功能用来做交差并补的) '''特征:自动去重 无序''' #定义一个空集合 setvar = set() #set()强制转换成一个空集合的数据类型 p ...

  4. Oracle集合运算符 交集 并集 差集

     集合运算符:UNION/UNION ALL 并集,INTERSECT 交集,MINUS 差集  一.union求并集,公共部分只有包含一次 例:求emp表ename中含’A‘或含有‘M’ SQL&g ...

  5. java求两个集合的交集和并集,比较器

    求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...

  6. 求两个集合的交集和并集C#

    我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...

  7. PHP求并集,交集,差集

    PHP求并集,交集,差集 一.总结 一句话总结:在php中如果我想要对两个数组进行如并集.交集和差集操作,我们可直接使用php自带的函数来操作如array_merge(),array_intersec ...

  8. 利用Underscore求数组的交集、并集和差集

    1 数组交集函数——intersection 数组的交集是指包含多个数组中的共同元素的一个数组,求数组的交集就是找出给定数组中的共有元素. 下面实现一个求两个数组交集的函数. 判断数组是够包含指定值, ...

  9. List和set集合:交集、差集、合集的区别retainAll,removeAll、addAll

    set .list集合的交集(retainAll).差集(removeAll)是没有区别的都是一样的. set .list集合的合集addAll是有区别的:set可以去重复:list不去重复 publ ...

随机推荐

  1. BZOJ_2152_聪聪可可_点分治

    BZOJ_2152_聪聪可可_点分治 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)…… ...

  2. Go中原始套接字的深度实践

    1. 介绍 2. 传输层socket 2.1 ICMP 2.2 TCP 2.3 传输层协议 3. 网络层socket 3.1 使用Go库 3.2 系统调用 3.3 网络层协议 4. 总结 4.1 参考 ...

  3. surging 微服务引擎 1.0 正式发布

    surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用,服务引擎支持http.TCP.WS.Mqtt协议,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希 ...

  4. 使用BeetleX的TcpBenchmark工具进行百万设备模拟测试

    其实TCP测试的工具有很多,那BeetleX工具所提供的特点又是什么呢?如果你需数十万的请求或模拟上百万的设备连接,那这个工具相信可以满足你的需要!工具是基于BeetleX的基础功能扩展,支持多IP绑 ...

  5. WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法

    WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...

  6. Windows代码,添加一个节,以及RVA跟FOA互相转化,以及内存文件对齐代码.

    / 1.修改文件头节个数 +1 2.修改ImageBase 3.遍历节表,拷贝最后一个节表到下面 4.修改节的虚拟大小(节表.virtualSize) 5.修改节的虚拟地址(RVA 节表.virtua ...

  7. OAuth2.0记录

    阮一峰老师讲解OAuth2.0 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 举例详解: https://www.cnblogs.com/ ...

  8. 01 Java jdk环境配置

    1.1 书籍(B) [1] java核心技术 [2] 实战java 1.2 网址(B) oracle.com http://www.ibm.com/developerWorks/cn/ https:/ ...

  9. css 四周边框角加粗效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. UiPath实践经验总结(一)

    用UiPath做RPA也有一段时间了,初上阵不久,遇到过不少大大小小的坑.以下列出一些心得体会,望能抛砖引玉,与同行进行更多交流. 1. 日志策略:将UiPath Robot的Logging Leve ...