前言:

  在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色了。

  在上篇博客的时候就在想multiset去掉multi会是啥,然后就来到了这一节,set。

  1.1 set的作用

  set和multiset的区别在于容器内不能有重复元素

  a和b重复等价于“a必须排在b前面”和“b必须排在a前面”都不成立。这都强调多少次了,不过每一次都不一样就是了,这里是重复,之前是相等以及排序。

  set插入元素可能不成功

  使用时同样要注意#include<set>

  1.2 set的用法

  也先给上代码样例:

 1 #include<iostream>
2 #include<cstring>
3 #include<set>
4 using namespace std;
5
6 int main(int argc, char const *argv[])
7 {
8     set<int> st;
9     int a[10] = {1,2,3,8,7,7,5,6,8,12};
10     for (int i = 0; i < 10; i++)
11     {
12         st.insert(a[i]);
13     }
14     cout<<st.size()<<endl;//结果:8
15     //这里就是set的特色所在了,7和7,8和8重复了,只留下了一个7和一个8
16     set<int>::iterator i;
17     for ( i = st.begin(); i != st.end(); i++)
18     {
19         cout<<*i<<",";//结果:1,2,3,5,6,7,8,12,
20     }//没有重复元素
21     cout<<endl;
22     pair<set<int>::iterator,bool>result = st.insert(2);
23     //我试了下,这个insert的返回值也是pair类型,first是
24     //iterator,second是bool,所以说不能调换位置。
25     /*
26     pair<set<int>::iterator,bool>
27     等价于
28     struct
29     {
30         set<int>::iterator first;
31         bool second;
32     }
33     */
34     if (!result.second)//条件成立说明插入不成功
35     {//此时first这个迭代器就会指向那个重复的元素
36         cout<<*result.first<<" already exists."<<endl;
37     }
38     else
39     {
40         cout<<*result.first<<" inserted."<<endl;
41     }//结果:2 already exists.
42     return 0;
43 }

样例

  老样子,我们从代码里找出有用的地方来简单介绍。

  1、set的建立:

  set<int> st;

  st.insert(a[i]);

  这个插入就会体现出set的特色了,样例中插入了10个元素,输出st.size()时却只有8的大小,这是因为输入了两个7和两个8,因为重复,所以插入♂不了了。

  2、pair<T1,T2>的使用

  我们在程序中使用了pair<set<int>::iterator,bool>result = st.insert(2);来让result这个pair类型变量接收insert()的返回值,那么pair是什么呢?

  在这个地方:

  pair<set<int>::iterator,bool>

  等价于:

1 struct
2 {
3     set<int>::iterator first;
4     bool second;
5 }result;

  而:

  pair<T1,T2>类型等价于:

1 struct
2 {
3     T1 first;
4     T2 second;
5 };

  例如:pair<int, double>a;

  等价于:

1 struct
2 {
3     int first;
4     double second;
5 }a;
6 a.first = 1;
7 a.second = 93.93;

  最后补充一下:

  刚刚调试了一下发现insert()的返回值是pair类型,其中first是iterator类型,指向已经插入了的那个值的位置,second是bool类型,用于反馈插入是否成功。成功和失败都会用迭代器返回值的位置,成功时second的值为true,失败时为false,可以拿上面样例改个数字进行调试而知道这个结果。顺带一提,first和second调换先后会报错,就是说不能pair<bool,set<T>::iterator>。(本来觉得它挺智能的,其实也就那样哈哈哈)

  后记:

  这里主要介绍了set和pair的用法,不知道STL标准库还有多少多少东西可以研究(挺有意思的),老师推荐了一本书《C++标准库》,等书到了我就去把一些常用的STL标准库中的东东做成笔记扔进博客。感谢大家读到这里,祝大家青春永驻,byebye~~~。

C++STL标准库学习笔记(五)set的更多相关文章

  1. C++STL标准库学习笔记(三)multiset

    C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...

  2. C++STL标准库学习笔记(一)sort

    前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...

  3. C++STL标准库学习笔记(二)二分查找

    二.STL中的二分查找算法 1.binary_search 2.lower_bound 3.upper_bound 记得#include<algorithm>! 前言: 在这个笔记中,我把 ...

  4. C++STL标准库学习笔记(四)multiset续

    自定义排序规则的multiset用法 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,只不过这一次的笔记主要是我的补充 ...

  5. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  6. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  7. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. STL标准库-算法-常用算法

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...

  9. STL标准库-容器-set与multiset

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...

随机推荐

  1. mongodb(一)

    文档是 MongoDB 的核心,类似于 SQLite 数据库(关系数据库)中的每一行数据.多个键及其关联的值放在一起就是文档.在 Mongodb 中使用一种类 json 的 bson 存储数据,bso ...

  2. 论文解读(Line)《LINE: Large-scale Information Network Embedding》

    论文题目:<LINE: Large-scale Information Network Embedding>发表时间:  KDD 2015论文作者:  Jian Tang, Meng Qu ...

  3. [noi1760]SAM

    建立SAM,求出每一个节点最左边的出现位置(即right集合中的最小元素,在树上dfs即可) 枚举左端点i和右端点j(保证j是最小的满足$s[i,j)$不是$s[0,i)$的子串),维护k表示$s[i ...

  4. nginx配置8081端口异常

    1.为nginx配置8081端口,结果nginx报错. (nginx配置8081端口监听,通过查看日志,出现nginx: [emerg] bind() to 0.0.0.0:8081 failed ( ...

  5. GoF23种(部分)软件设计模式【核心理解】

    设计模式复习 1. 面向对象设计原则 1.1 可维护性较低的软件设计 过于僵硬 过于脆弱 复用率低 黏度过高 1.2 一个好的系统设计 可扩展性 灵活性 可插入性 复用:一个软件的组成部分可以在同一个 ...

  6. CF45G

    考虑哥德巴赫猜想:一个偶数可以被拆分两个质数. 所以我们考虑如果不是偶数的话,我们拆分成\((2,m-2)\)或者\((3,del(m - 3))\) 如果是偶数的话\(del(m)\),我们直接枚举 ...

  7. Codeforces 547E - Mike and Friends(AC 自动机+树状数组)

    题面传送门 好久每做过 AC 自动机的题了--做几个题回忆一下罢 AC 自动机能够解决多串匹配问题,注意是匹配,碰到前后缀的问题那多半不在 AC 自动机能解决的范围内. 在初学 AC 自动机的时候相信 ...

  8. 详解getchar()函数与缓冲区

    1.首先,我们看一下这段代码: 它的简单意思就是从键盘读入一个字符,然后输出到屏幕.理所当然,我们输入1,输出就是1,输入2,输出就是2. 那么我们如果输出的是12呢? 它的输出是1. 这里我们先简单 ...

  9. KeepAlived双主模式高可用集群

    keepalived是vrrp协议的实现,原生设计目的是为了高可用ipvs服务,keepalived能够配置文件中的定义生成ipvs规则,并能够对各RS的健康状态进行检测:通过共用的虚拟IP地址对外提 ...

  10. 从零构建Java项目(Maven+SpringBoot+Git) #02 奥斯丁项目

    前两天我说要写个项目来持续迭代,有好多小伙伴都表示支持和鼓励,项目的第一篇这不就来了么~我给项目取了个名字,英文名叫做:austin,中文名叫做:奥斯丁 名字倒没有什么特别的含义,我单纯觉得这个名字好 ...