set也是STL中比较常见的容器。set集合容器实现了红黑树的平衡二叉检索树的数据结构,它会自动调整二叉树的排列,把元素放到适当的位置。set容器所包含的元素的值是唯一的,集合中的元素按一定的顺序排列。

我们构造set集合的目的是为了快速的检索,不可直接去修改键值。

set的一些常见操作:

begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true(真)
end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
insert() 在集合中插入元素
max_size() 返回集合能容纳的元素的最大限值
size() 集合中元素的数目
swap() 交换两个集合变量

其实set的大部分操作是与vector类似的,不过set不支持随机访问,必须要使用迭代器去访问。由于set放入一个元素就会调整这个元素的位置,把它放到合适的位置,所以set中只有一个insert插入操作。

对于集合来说,我们一般有并集、交集、差集、补集这几种操作,所以在set的操作中我们也有类似的集合操作,它们都在#include<algorithm>的头文件下:

[html] view plain copy
  1. std::set_intersection() :这个函数是求两个集合的交集。
  2. std::set_union() :求两个集合的并集
  3. std::set_difference():差集
  4. std::set_symmetric_difference():得到的结果是 第一个迭代器相对于第二个的差集 并上第二个相对于第一个的差集

学校OJ上有一个题可以来进行这几个操作,下面是学校OJ的题:

Description

集合的运算就是用给定的集合去指定新的集合。设A和B是集合,则它们的并差交补集分别定义如下:
A∪B={x|x∈A∨x∈B}
A∩B={x|x∈A∧x∈B}
A-B={x|x∈A∧x不属于 B}
SA ={x|x∈(A∪B)∧x 不属于A}
SB ={x|x∈(A∪B)∧x 不属于B}

Input

第一行输入一个正整数T,表示总共有T组测试数据。(T<=200)
然后下面有2T行,每一行都有n+1个数字,其中第一个数字是n(0<=n<=100),表示该行后面还有n个数字输入。

Output

对于每组测试数据,首先输出测试数据序号,”Case #.NO”,
接下来输出共7行,每行都是一个集合,
前2行分别输出集合A、B,接下5行来分别输出集合A、B的并(A u B)、交(A n B)、差(A – B)、补。
集合中的元素用“{}”扩起来,且元素之间用“, ”隔开。

Sample Input

14 1 2 3 10

Sample Output

Case# 1:
A = {1, 2, 3}
B = {}
A u B = {1, 2, 3}
A n B = {}
A - B = {1, 2, 3}
SA = {}
SB = {1, 2, 3}

我的代码如下:

[cpp] view plain copy
  1. #include<iostream>
  2. #include<set>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. void print(set<int> a)
  7. {
  8. if(a.begin() == a.end())
  9. cout << "}" << endl;
  10. for(set<int>::iterator it = a.begin();it!=a.end();it++)
  11. {
  12. if(++it==a.end())
  13. {
  14. it--;
  15. cout << *it << "}\n";
  16. }
  17. else
  18. {
  19. it--;
  20. cout << *it << ", ";
  21. }
  22. }
  23. }
  24. int main()
  25. {
  26. int T, cou = 0;
  27. set<int> a, b, c;
  28. cin >> T;
  29. while(T--)
  30. {
  31. cou++;
  32. a.clear(), b.clear(), c.clear();
  33. int n;
  34. cin >> n;
  35. for(int i=0;i<n;i++)
  36. {
  37. int x;
  38. cin >> x;
  39. a.insert(x);
  40. }
  41. cin >> n;
  42. for(int i=0;i<n;i++)
  43. {
  44. int x;
  45. cin >> x;
  46. b.insert(x);
  47. }
  48. cout << "Case# " << cou << ":" << endl;
  49. cout << "A = {";
  50. print(a);
  51. cout << "B = {";
  52. print(b);
  53. set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()));
  54. cout << "A u B = {";
  55. print(c);
  56. c.clear();
  57. set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()));
  58. cout << "A n B = {";
  59. print(c);
  60. c.clear();
  61. set_difference(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()));
  62. cout << "A - B = {";
  63. print(c);
  64. c.clear();
  65. set_difference(b.begin(),b.end(),a.begin(),a.end(),inserter(c,c.begin()));
  66. cout << "SA = {";
  67. print(c);
  68. c.clear();
  69. set_difference(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()));
  70. cout << "SB = {";
  71. print(c);
  72. }
  73. return 0;
  74. }

inserter是一个迭代器适配器中的插入迭代器。 原理:其内部调用insert()
功能:在容器的指定位置插入元素
限制:只有提供了inset()成员函数的容器中,inserter才能派上用场. 所有STL容器都提供了inset()函数.
适用:所有STL容器

C++ set的一些用法相关推荐

  1. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  2. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  3. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  4. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  5. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  6. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

  7. OpenMP用法大全

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  8. Dorado用法与示例

    Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...

  9. TensorFlow用法

    TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...

  10. TensorFlow Keras API用法

    TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...

最新文章

  1. Redux 入门教程(三):React-Redux 的用法
  2. ArrayList的内存泄露
  3. 马斯克教你的五步做事法
  4. android application 引起内存泄漏的原因
  5. python游戏编程入门书籍推荐-Python游戏编程入门3
  6. datax的工具配置oracle,完全小白级DataX安装配置过程详解
  7. Acwing 1084. 数字游戏 II
  8. 【JZOJ4920】【NOIP2017提高组模拟12.10】降雷皇
  9. vue登录页面ajax,springboot+vue 登录页面(三)
  10. 二进制转8421bcd码_绝对值编码器当中的格雷码
  11. FileInputStream.read()返回int类型原因
  12. python dxf_使用Python读取AutoCAD DXF文档
  13. CTF中压缩文件的常见解法
  14. c语言.jpg图片转成数组_pdf怎么转成jpg最简单 mac
  15. 给公司写了个人脸考勤系统!老大给了三千奖金。同事为啥记恨我?
  16. iOS 开发修改app名称(display Name)后实际app名称没有变的情况
  17. Android神兵利器之Image Asset Studio
  18. Amazon(AMZN)2020年第三季度收益电话会议记录
  19. 史上最全的Schnorr签名方案和BLS签名方案的全面对比
  20. 走近求伯君1 求伯君,1964年11月26日出生于浙江新昌县。

热门文章

  1. rac san+oracle_Oracle11g1+RAC+install+for+CentOS5(ASM+to+FC+SAN)_IT168文库
  2. python基本模块中的对象_Python 学习笔记 -- OS模块的常用对象方法
  3. 计算机电源稳压,一种用于计算机的电源稳压电路
  4. 光纤收发器常见的一些问题和检测方法
  5. 【渝粤教育】国家开放大学2018年春季 8625-21T老年心理健康 参考试题
  6. 【渝粤教育】电大中专职业健康与安全 (3)作业 题库
  7. 【渝粤教育】广东开放大学 数据结构 形成性考核 (24)
  8. matlab查找替换指令,使用matlab GUI在.txt文件中编辑特定数字使用搜索/替换
  9. 下载不了java应用程序_Java 7u45 - java webstart不会下载我的jar并执行应用程序,除非我显示java控制台...
  10. 分子动力学模拟软件_功能玻璃专题——分子动力学模拟预测氧化钠含量对二元钠硅酸盐玻璃弹性模量的影响...