C++ STL 集合运算

定义于头文件<algorithm>的算法:

集合运算的前提是两个集合必须按照同样的规则排序就绪,否则不能进行集合运算!
- map,set是有序集合,可以直接参加运算;vector是无序集合,参与运算前必须首先排序.

template< class InputIt1, class InputIt2, class OutputIt >
前两个参数是输入参数,代表参与集合运算的两个集合,最后一个是输出参数,输出运算结果(**也是相同排序规则的集合**)。
  • 交集(set_intersection) A∩BA∩BA \cap B
    OutputIt set_intersection( InputIt1 first1, InputIt1 last1,InputIt2 first2, InputIt2 last2, OutputIt d_first );
  • 并集(set_union) A∪BA∪BA \cup B
    OutputIt set_union( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first );
  • 差集(set_difference) A−BA−BA - B
    OutputIt set_difference( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first );
  • 对称差集(set_symmetric_difference) A∪B−(A∩B)A∪B−(A∩B)A \cup B - (A \cap B)
    OutputIt set_symmetric_difference( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first );
  • 如果使用比较函数,末尾再追加一个参数,用法见示例.

附完整示例代码

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iterator>/**************************************************** map key compare* include compare string's length* 用于排序map的keys,如:"P1","P2","P10",...* 用法:* (1)map键值排序:map<string,int,cmpByKey> map1;* (2)set排序: set<string,cmpByKey> set1;* (3)vector<string>排序:*      #include <algorithm>*      vector<string> vec1;*      std::sort(vec1.begin(), vec1.end(), cmpByKey());****************************************************/
struct cmpByKey {bool operator()(const std::string& lhs, const std::string& rhs) const{bool ret;if (lhs.size() == rhs.size())ret = lhs < rhs ? true : false;elseret = lhs.size() < rhs.size() ? true : false;return ret;}
};using namespace std;// 使用默认比较函数less<>排序
int main1()
{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());  // 升序排序,默认使用less<int>比较函数std::sort(v2.begin(), v2.end());  // A交Bcout << "set_intersection:" << endl;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 << ' '; cout << endl; // 5 7// A并Bcout << "set_union" << endl;std::vector<int> dest1;std::set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dest1));for (const auto &i : dest1) std::cout << i << ' ';  std::cout << '\n';  // 1 2 3 4 5 6 7 8 9 10// A - Bcout << "set_difference" << endl;std::vector<int> diff;std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(diff));for (int n : diff) std::cout << n << ' '; cout << endl;  // 1 2 3 4 6 8// 对称差(symmetric_difference,A并B - A交B)cout << "set_symmetric_difference" << endl;std::vector<int> v_symDifference;std::set_symmetric_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v_symDifference));for (int n : v_symDifference) std::cout << n << ' '; // 1 2 3 4 6 8 9 10cout << endl;system("pause");return 0;
}// 使用非默认比较函数
int main()
{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());  // 升序排序,默认使用less<int>比较函数//std::sort(v2.begin(), v2.end());// 采用非默认比较函数,std::sort(v1.begin(), v1.end(), greater<int>());  // 降序排序std::sort(v2.begin(), v2.end(), greater<int>());// 集合运算必须与集合的排序规则一致,因此最后一个参数需设置比较函数// A交Bcout << "set_intersection:" << endl;std::vector<int> v_intersection;std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v_intersection),greater<int>());for (int n : v_intersection) std::cout << n << ' '; cout << endl; // 7 5// A并Bcout << "set_union" << endl;std::vector<int> dest1;std::set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dest1),greater<int>());for (const auto &i : dest1) std::cout << i << ' ';  std::cout << '\n';  // 10 9 8 7 6 5 4 3 2 1 // A - Bcout << "set_difference" << endl;std::vector<int> diff;std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(diff),greater<int>());for (int n : diff) std::cout << n << ' '; cout << endl;  // 8 6 4 3 2 1// 对称差(symmetric_difference,A并B - A交B)cout << "set_symmetric_difference" << endl;std::vector<int> v_symDifference;std::set_symmetric_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v_symDifference),greater<int>());for (int n : v_symDifference) std::cout << n << ' '; // 10 9 8 6 4 3 2 1cout << endl;set<string, cmpByKey> set1 = { "P1","P10","P3","P20" };set<string, cmpByKey> set2 = { "P10","P2" };set<string, cmpByKey> results;/******** 编译出错,修改为下句 *********///std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::back_inserter(results), cmpByKey());std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(results, results.end()), cmpByKey());for (string s : results) std::cout << s << ' '; cout << endl;  // P10results.clear();std::set_union(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(results, results.end()), cmpByKey());for (string s : results) std::cout << s << ' '; cout << endl;  // P1 P2 P3 P10 P20results.clear();std::set_difference(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(results, results.end()), cmpByKey());for (string s : results) std::cout << s << ' '; cout << endl;  // P1 P3 P20results.clear();std::set_symmetric_difference(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(results, results.end()), cmpByKey());for (string s : results) std::cout << s << ' '; cout << endl;  // P1 P2 P20system("pause");return 0;
}

参考

C++参考手册 https://zh.cppreference.com/w/cpp/algorithm/

C++ STL 集合运算相关推荐

  1. c语言集合运算有菜单,怎样用C语言实现集合运算

    [转]STL算法-合并(集合) hechao322514692017-02-24 R:集合运算 thoixy29792014-10-27 C++ STL 集合运算 weixin_42993054605 ...

  2. 离散数学实验三则(关系元算,集合运算与操作,最短路)

    前言 前段时间才做了离散实验的实验报告,为防止在本地遗失,所以上传到CSDN上一份,欢迎大家一起学习 实验1 关系元算 实验报告内容 一.实验目的 熟悉掌握命题逻辑中的联结词.真值表.主范式等,进一步 ...

  3. 蓝桥杯集合运算问题c语言,蓝桥杯 集合运算(set)

    算法训练 集合运算 时间限制:1.0s   内存限制:512.0MB 问题描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中的元素个数. ...

  4. C++集合 STL集合 set集和--交集、并集、差集、对称差

    C++的STL为我们提供了集合的操作方法. STL库中有丰富的集合运算方法,我们可以使用它们快速完成交集.并集.差集.对称差集的运算. 交集(intersection) 交集是集合运算中经常会用到的计 ...

  5. 集合 —— 集合与集合运算

    [概述] 集合,是集合论中主要研究对象,是指具有某种特定性质的具体的或抽象的对象汇总而成的集体,其中,构成集合的这些对象则称为该集合的元素. 集合中元素的数目称为集合的基数,集合 A 的基数记作:ca ...

  6. 关于学习Python的一点学习总结(37->集合运算)

    77.集合运算. >>> num={}>>> type(num)<class 'dict'>>>> num1={1,2,3,}> ...

  7. (Alan Murta)编制的多边形集合运算软件包(general polygon clipping library,简称GPC)

    今天无意中看到这个包,期待以久的好东西,发布的很早了,可惜我今天才看到,先存起来,下来慢慢看. (Alan Murta)编制的多边形集合运算软件包(general polygon clipping l ...

  8. python【蓝桥杯vip练习题库】ALGO-10集合运算

    试题 算法训练 集合运算 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中 ...

  9. java+实现集合并运算_JAVA程序设计报告+集合运算

    JAVA程序设计报告+集合运算 JAVA程序设计报告集合的运算(交并差)学生学号专业信息工程(系统工程方向)院系信息与控制学院实习时间三周:指导老师陈金辉目录实验目的试验设计实验源程序程序设计调试不足 ...

最新文章

  1. Objective-c官方文档 怎么自定义类
  2. 02 java多线程基础
  3. 【专家专栏】浅谈百度搜索排序
  4. 蓝桥杯java 最短路_Java实现蓝桥杯 最短路
  5. 20200627每日一句
  6. android 仿qq it蓝豹,十大Android开源项目-IT蓝豹
  7. 数据包络分析法matlab,Matlab学习系列31数据包络分析法(DEA).docx
  8. hdu3709——数位dp+枚举
  9. linux系统怎么连接显示器,Linux下笔记本外接显示器 · Eulerlee
  10. adobe air for ubuntu + markman 安装?
  11. SOLIDWORKS中钣金展开标注是英文怎么办?
  12. 名悦集团:车撞报废,保险能赔多少?
  13. win7安装android驱动失败怎么办,Win7蓝牙驱动安装失败的原因分析与解决方法
  14. [Image_Codec]常见图片格式的封装及编解码-Android平台(三)JPG
  15. 宇视摄像机巡航和自动跟踪哪个优先级高?
  16. AHP层析分析法初步讲解
  17. MinGW编译log4cpp
  18. 网页设计期末作业ppt+源码(免费获取)
  19. iOS 与 Android 系统十年之战,究竟谁是赢家?
  20. 文本复述,中文文本数据增强

热门文章

  1. kafka架构之zookeeper元数据管理
  2. 大学物理(1):质点动力学
  3. 卡鲁机器人智能_成都屹安自动化 | MiR自主协作式智能AGV、优傲人机协作机器人...
  4. Windows开启administrator账户
  5. 特征提取PCA实现及避坑指南
  6. 变量的命名规则及规范
  7. ZigBee简介\应用协议\解决方案商介绍
  8. 嵌入式代码学习心得记录
  9. macOS 常用命令
  10. 哪一类功率放大电路效率最高_详述推挽式功率放大输出电路