C++求集合的交集差集
标准库的<algorithm>
头文件中提供了std::set_difference
,std::set_intersection
和std::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
中有,而v1
和v2
中交集没有的元素。
最后的输出结果如下:
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
的结构很简单,只有两个字段:group
和md5
。 然后重载了运算符<
方便排序,排序的规则是: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++求集合的交集差集的更多相关文章
- C# 集合的交集 差集 并集 去重
C# 集合的交集 差集 并集 去重 两个对象list,直接比较是不行的,因为他们存的地址不一样 需要重写GetHashCode()与Equals(object obj)方法告诉电脑 class Stu ...
- C# 数组比较--取得两个集合的交集,差集,并集的方法
方法关键字: 交集:Intersect 差集:Except 并集:Union 使用代码: , , , , }; , , , , }; var 交集 = arr1.Intersect(arr2).ToL ...
- python-->(set /dict)交集 差集 并集 补集(功能用来做交差并补的)
# ### 集合 作用:交集 差集 并集 补集(功能用来做交差并补的) '''特征:自动去重 无序''' #定义一个空集合 setvar = set() #set()强制转换成一个空集合的数据类型 p ...
- Oracle集合运算符 交集 并集 差集
集合运算符:UNION/UNION ALL 并集,INTERSECT 交集,MINUS 差集 一.union求并集,公共部分只有包含一次 例:求emp表ename中含’A‘或含有‘M’ SQL&g ...
- java求两个集合的交集和并集,比较器
求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...
- 求两个集合的交集和并集C#
我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...
- PHP求并集,交集,差集
PHP求并集,交集,差集 一.总结 一句话总结:在php中如果我想要对两个数组进行如并集.交集和差集操作,我们可直接使用php自带的函数来操作如array_merge(),array_intersec ...
- 利用Underscore求数组的交集、并集和差集
1 数组交集函数——intersection 数组的交集是指包含多个数组中的共同元素的一个数组,求数组的交集就是找出给定数组中的共有元素. 下面实现一个求两个数组交集的函数. 判断数组是够包含指定值, ...
- List和set集合:交集、差集、合集的区别retainAll,removeAll、addAll
set .list集合的交集(retainAll).差集(removeAll)是没有区别的都是一样的. set .list集合的合集addAll是有区别的:set可以去重复:list不去重复 publ ...
随机推荐
- sum() 函数性能堪忧,列表降维有何良方?
本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/mK1nav2vKykZaKw_TY-rtw Python 的内置函数 ...
- 微服务架构 - 巧妙获取被墙的Docker镜像
在国内由于种种原因,有些Docker镜像直接是获取不到的,特别是k8s中的一些镜像.本人在部署k8s中的helm组件时需要获取tiller镜像,如果直接用如下命令: docker pull gcr.i ...
- Redis学习——详解Redis配置文件(三)
一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...
- C# -Asp.Net.SignalR.Core之Hub
前言 程序员的进步是需要环境的,良好的团队环境,良好的开发环境,会让人进步的更加快速. 所以,我认为,如果一个程序员,在2019年还在用Visual Studio 2005开发,那么,他,大概率,不会 ...
- DevOps实践之一:基于Docker构建企业Jenkins CI平台
基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...
- java基础(七)-----深入剖析Java中的装箱和拆箱
本文主要介绍Java中的自动拆箱与自动装箱的有关知识. 基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型 ...
- js 异步转同步
在项目中有些逻辑或者请求依赖另一个异步请求,大家常用的方法是回调函数.现在有个高大上的解决方案:await async . async 是“异步”的简写,而 await 可以认为是 async wai ...
- Angular(02)-- Angular-CLI命令
声明 本系列文章内容梳理自以下来源: Angular 官方中文版教程 官方的教程,其实已经很详细且易懂,这里再次梳理的目的在于复习和巩固相关知识点,刚开始接触学习 Angular 的还是建议以官网为主 ...
- ArcGIS 网络分析[0] 介绍与博文目录【更新中】
网络分析是个热点,理论上是属于计算机图形学和数据结构的,GIS以此为基础做出应用. 以下列举本人在学习中遇到的网络分析问题与经验总结. 1. 软件平台及数据准备 平台:Windows 10 操作系统, ...
- 正向代理&反向代理 简(fu)明(za)解释
最近写的东西越来越偏向Web程序员了··· 你想读懂本篇,就要知道什么是Web服务器——装在世界上某个机房里某台机器里某个操作系统里的一个,对外(公网或者你能访问)服务各种你需要的信息的软件! 它可以 ...