标准库的<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_2561_最小生成树_最小割

    BZOJ_2561_最小生成树_最小割 题意: 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条 ...

  2. 本周新学的 GUI绘图技术

    作者语录:"终于学到绘图了 看到这种有图案的心情美丽多了  希望自己可以越学越多 越学越好" 本次就不用图片展示效果了,纯文字. 1.Graphics类概述 画图时我们都需要拥有一 ...

  3. css3 深入理解flex布局

    一.简要介绍 css3最喜欢的新属性之一便是flex布局属性,用六个字概括便是简单.方便.快速. flex( flexible box:弹性布局盒模型),是2009年w3c提出的一种可以简洁.快速弹性 ...

  4. TensorFlow实现分布式计算

    摘要: 1.代码例子 内容: 1.代码例子 <TensorFlow实战>实现CNN处理CIFAR10数据,并模拟单机多个CPU同步数据并行计算 <TensorFlow实战>实现 ...

  5. TensorFlow TensorBoard使用

    摘要: 1.代码例子 2.主要功能内容: 1.代码例子 <TensorFlow实战>使用MLP处理Mnist数据集并TensorBoard上显示 2.主要功能 执行TensorBoard程 ...

  6. Java的多态浅谈

    概述 Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的引用变量所指向具 ...

  7. 第一册:lesson1-2.

    原文: lesson 1 Excuse me! Excuse me! Yes? Is this your handbag? Pardon? Is this your handbag? Yes it i ...

  8. redis增删查改数据Util

    目录 (1)需要导入的包 (2)redis配置文件 (3)RedisUtil类 (1)需要导入的包 <dependency> <groupId>org.springframew ...

  9. jqGrid 常用 总结 -2

    这次的总结是针对于一次bug,先说下我们遇到的问题,就是后台人员告诉我们添加数据到100条数据的时候,101条就看不到,当时我觉得就是没有分页的原因,所以我就以为在jqgrid中设置一个loadonc ...

  10. 用animation的steps属性制作帧动画

    昨天火急火燎地接到一个任务,说是要做一个掷骰子的游戏,关于掷骰子期间的过渡动画,我本来是想用css 3d制作一个立体的骰子,然后叫UI给6张平面图贴上去.再用translate3d来操作.然而UI考虑 ...