博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++求集合的交集差集
阅读量:6196 次
发布时间:2019-06-21

本文共 2867 字,大约阅读时间需要 9 分钟。

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

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

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

std::vector
v1{ 1,2,3,4,5,6,7,8 }; std::vector
v2{ 5, 7, 9,10 }; std::sort(v1.begin(), v1.end()); std::sort(v2.begin(), v2.end()); std::vector
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
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 71 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
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
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_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_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;

最终的输出结果:

439761-20181225111213137-742096237.png

总结

并集()

交集()
差集()
inserter()
back_inserter()

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

转载地址:http://zdyca.baihongyu.com/

你可能感兴趣的文章
【转】Deep Learning(深度学习)学习笔记整理系列之(二)
查看>>
代码质量与上线压力
查看>>
系统时间不对 导至不能正常上网
查看>>
php 使用 ffmpeg 转换视频,截图,并生成缩略图
查看>>
jQuery EasyUI API 中文文档 - 加载器
查看>>
addedbytes.com 制作的速查表欣赏
查看>>
程序员好难...
查看>>
WPF下载远程文件,并显示进度条和百分比
查看>>
实现app上对csdn的文章查看,以及文章中图片的保存 (制作csdn app 完结篇)
查看>>
excel使用技巧
查看>>
Flymeos插桩适配教程
查看>>
Ubuntu 14.04下单节点Ceph安装(by quqi99)
查看>>
[Python] Handle Exceptions to prevent crashes in Python
查看>>
Linux鸟哥(总)
查看>>
Rhino and Envjs
查看>>
ibatis - sqlMapConfig.xml配置文件详解
查看>>
从Zend Engine 2.0的设计蓝图(草稿)看PHP的将来
查看>>
【HeadFirst 设计模式学习笔记】5 单例模式
查看>>
Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现
查看>>
Aspose.Pdf for Java 4.0 发布
查看>>