C++STL标准库学习笔记(五)set
前言:
在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色了。
在上篇博客的时候就在想multiset去掉multi会是啥,然后就来到了这一节,set。
1.1 set的作用
set和multiset的区别在于容器内不能有重复元素
a和b重复等价于“a必须排在b前面”和“b必须排在a前面”都不成立。这都强调多少次了,不过每一次都不一样就是了,这里是重复,之前是相等以及排序。
set插入元素可能不成功
使用时同样要注意#include<set>
1.2 set的用法
也先给上代码样例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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的更多相关文章
- C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...
- C++STL标准库学习笔记(一)sort
前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...
- C++STL标准库学习笔记(二)二分查找
二.STL中的二分查找算法 1.binary_search 2.lower_bound 3.upper_bound 记得#include<algorithm>! 前言: 在这个笔记中,我把 ...
- C++STL标准库学习笔记(四)multiset续
自定义排序规则的multiset用法 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,只不过这一次的笔记主要是我的补充 ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- STL标准库-算法-常用算法
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...
- STL标准库-容器-set与multiset
技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...
随机推荐
- Python 流程控制-分支结构详解
目录 Python 流程控制--分支结构 1.结构分类 顺序结构 分支结构 循环结构 2.分支结构详解 分支结构 定义格式: if 单支结构 if 双分支结构 if 多分支结构 Python 流程控制 ...
- request模块做post请求时,body为json格式,并且带有中文,如何请求
后台接口只能解析json,并且一定要是中文才能解析出来,如果是unicode编码的中文则会报错 看requests的源码.以下为解决方法: #将requests库中的models.py文件中的第461 ...
- [nowcoder5668I]Sorting the Array
令$f(n,b,m)=a[1..n]$(这里下标从1开始),考虑一些性质: 性质1.对于$\forall 1\le i\le n-m+1$,若$\exists 1\le j<i,a[j]> ...
- [loj3302]信号传递
由于n较大,可以将n个数中的关系对数量记录在$m*m$的矩阵中,记作$a[i][j]$ 考虑朴素的状压dp枚举排列,即$f[i]$表示以i中的数的一种排列为整个序列的前缀的最小代价,然后转移枚举下一个 ...
- 史上最俗的MODBUS介绍
如今网购正深深地改变着人们的生活,以前买东西要逛商场,先找楼层导购,再逛到相应柜台,接着愉快购物,选好东西后经过一番讨价还价,最后付钱拿货走人,这些都是稀松平常的场景.可是,如果没有实际看见东西,只在 ...
- 使用idea创建Kotlin项目
1.打开idea 2.选择项目方式: 3.nest 4.创建文件名 4.finish 看这目录结构和java没什么区别 5.在src目录下新建一个Kotlin文件 fun main(args:} fu ...
- 第41篇-JNIEnv与JavaVM的初始化
JavaVM和JNIEnv的初始化和JVM各模块的初始化都是在JNI_CreateJavaVM()函数中完成.这一篇将详细介绍JavaVM和JNIEnv的初始化过程. 1.初始化JavaVM Java ...
- Codeforces 788E - New task(线段树)
Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1E,而且被!我!自!己!搞!出!来!了! 虽然我承认它难度及摆放的位置异常异常虚高,并且就算我到了现场也不可 ...
- Codeforces 923E - Perpetual Subtraction(微积分+生成函数+推式子+二项式反演+NTT)
Codeforces 题目传送门 & 洛谷题目传送门 神仙题 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 首先考虑最朴素的 \(dp\),设 \(dp_{z,i}\) 表示经 ...
- 文件IO与标准IO的区别
文件IO与标准IO的区别 文件I/O就是操作系统封装了一系列函数接口供应用程序使用,通过这些接口可以实现对文件的读写操作,文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立 ...