C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset
STL中的平衡二叉树数据结构
前言:
在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来。
介绍:
有时需要在大量增加,删除数据的同时,还需要大量数据的查找
我们希望增加数据,删除数据,查找数据都能在log(n)复杂度完成
排序+二分查找显然不行,因为加入新数据就要重新排序。
在这个时候!我们就可以使用“平衡二叉树”数据结构存放数据,体现在STL中就是以下四种“排序容器”:
multiset set multimap map
英语课:set:集合
反正我们只管用就行了,具体实现应该可以参考《STL源码剖析》
从这里开始就需要有一定程度的数据结构和C++面向对象的知识了,如果忘记的话可以去复习一下,当然,这里我们只要会用就行了,不需要特别深的理解。
1.1 multiset用法
multiset<T> st;
定义了一个叫multiset变量st,st里面可以存放T类型的数据(自定义元素也行),并且能够自动排序。开始st为空。
排序规则:表达式“a < b”为true,则a排在b前面
可用st.insert添加元素,st.find查找元素,st.erase删除元素,复杂度都是log(n)(还有好多函数,这个就要自己去研究了,以后有机会也会来补充的)
1.2 multiset上的迭代器
multiset<T>::iterator p;
p是迭代器,(大致)相当于指针,可用于指向multiset中的元素。访问multiset中的元素要通过迭代器。
与指针的不同:
multiset上的迭代器可++,--,用!=和==比较,不可比大小,不可加减整数,不可相减。(指针就能这样操作,可以用来算长度啥的)
multiset<T> st;
st.begin() 返回值类型为 multiset<T>::iterator,是指向st中的头一个元素的迭代器。
st.end() 返回值类型为 multiset<T>::iterator,是指向st中的最后一个元素后面的迭代器。(有没有一种既视感,就是[ st.begin(), st.end() )和前面sort的范围很像,不过估计是因为迭代器不能比较大小,为了方便判断全部遍历过了就让st.end()指向了最后一个的后面,访问到st.end()时刚好退出)
对迭代器 ++ ,其就指向容器中下一个元素,-- 令其指向上一个元素。
样例:

1 #include<iostream>
2 #include<cstring>
3 #include<set>//使用multiset和set需要
4 using namespace std;
5 int main(int argc, char const *argv[])
6 {
7 multiset<int>st;
8 int a[10] = {1,14,12,13,7,13,21,19,8,8};
9 for (int i = 0; i < 10; i++)
10 {
11 st.insert(a[i]);//插♂入的是a[i]的复制品
12 }
13 multiset<int>::iterator i;//迭代器,近似于指针
14 for ( i = st.begin(); i != st.end(); i++)
15 {
16 cout<<*i<<",";//输出:1,7,8,8,12,13,13,14,19,21,
17 }
18 cout<<endl;
19 i = st.find(22);//查找22,返回值是迭代器
20 if (i == st.end())//查找不到则返回值为end()
21 {
22 cout<<"Not Found"<<endl;//输出:Not Found
23 }
24 st.insert(22);//插入22
25 i = st.find(22);
26 if (i == st.end())
27 {
28 cout<<"Not Found"<<endl;
29 }
30 else
31 {
32 cout<<"Found:"<<*i<<endl;//输出:Found:22
33 }//找到则返回指向找到的元素的迭代器
34
35 i = st.lower_bound(13);
36 //返回最靠后的迭代器it,使得[begin,it)中的元素
37 //都在13前面,复杂度log(n)
38 cout<<*i<<endl;//结果:13
39 i = st.upper_bound(8);
40 //返回最靠前的迭代器it,使得[it,end())中的元素
41 //都在8后面,复杂度log(n)
42 cout<<*i<<endl;//结果:12
43 st.erase(i);//删除迭代器i指向的元素,即12
44 for ( i = st.begin(); i != st.end(); i++)
45 {
46 cout<<*i<<",";//输出:1,7,8,8,13,13,14,19,21,22,
47 }
48
49 return 0;
50 }
样例
程序中部分重要的地方单独拎出来强调:
i = st.find(22);
作用是查找22,返回值是迭代器
i = st.lower_bound(13);
返回最靠后的迭代器it,使得[begin,it)中的元素
都在13前面,复杂度log(n)
i = st.upper_bound(8);
返回最靠前的迭代器it,使得[it,end())中的元素
都在8后面,复杂度log(n)
st.erase(i);
删除迭代器i指向的元素
1.3后记:
从这里开始就有数据结构那味了,如果平衡二叉树忘记的话,记得去看看(虽然我觉得逻辑理解了,会用就行)。另外,可以看见这里的用法和前面sort,binary_search之类也有相似之处,估计学完一部分STL标准库内容,其他内容看到函数名就会用了。感谢大家读到这里,祝大家健康快乐吉祥如意恭喜发财学业有成早生贵子年年有余,以及头发茂密,下篇博客再见拜拜。
C++STL标准库学习笔记(三)multiset的更多相关文章
- C++STL标准库学习笔记(五)set
前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色 ...
- C++STL标准库学习笔记(一)sort
前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...
- C++STL标准库学习笔记(二)二分查找
二.STL中的二分查找算法 1.binary_search 2.lower_bound 3.upper_bound 记得#include<algorithm>! 前言: 在这个笔记中,我把 ...
- C++STL标准库学习笔记(四)multiset续
自定义排序规则的multiset用法 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,只不过这一次的笔记主要是我的补充 ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
- STL标准库-容器-set与multiset
技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...
- STL标准库-容器-set与map
STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...
- openresty 学习笔记三:连接redis和进行相关操作
openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
随机推荐
- Python基础(API接口测试)
import flask,json,pymysql from flask import request, jsonify, Response from datetime import datetime ...
- python实现对象测量
目录: 问题,轮廓找到了,如何去计算对象的弧长与面积(闭合),多边形拟合,几何矩的计算等 (一)对象的弧长与面积 (二)多边形拟合 (三)几何矩的计算 (四)获取图像的外接矩形boundingRect ...
- [cf643G]Choosing Ads
首先对于$p>50$,有经典的做法,即不断删去区间中不同的两数,最终剩下的即为出现次数超过一半的数(或没有),用线段树维护即可 那么对于$p\le 50$,类似的,即删去区间中不同的$\lflo ...
- [bzoj3171]循环格
如果把这个矩阵看成一张图,题目相当于要求每一个点的入度和出度都是1(也就是有很多环),否则指向环的点就无法走回自己了将所有点拆成两个,S向原来的点流(1,0)的边,拆出来的点向T连(1,0)的边,然后 ...
- java 后台通过IO流把文件传到前端并下载
我的业务需求是两个不同的web程序放在不同的服务器上,web程序A要访问到web程序B上传上来的文件,所以用到了这一个IO读取文件的接口 JAVA代码(排版有点问题 已经尽力补救了(:3_ヽ)_) ...
- C#.NET 操作Windows服务(安装、卸载)
注意点: 1.安装时要请求到管理员权限. 2.卸载前,一定要停止掉Windows服务,否则需要重启或注销电脑.代码无法停止服务时,使用services.msc来停止. 开始: 1.新建一个名为&quo ...
- Codeforces Round #717 (Div.2) 题解
我 AK 的第二场(?)的 Div.2,还捡了个 rk4(虽然我 div2 only 的最高记录是 rk2)祭之( A 这题我竟然 WA 了两发,丢人( 直接贪心,对于 \(i=1,2,\cdots, ...
- CF1493E Enormous XOR
题目传送门. 题意简述:给出长度为 \(n\) 的二进制数 \(l,r\),求 \(\max_{l\leq x\leq y\leq r}\oplus_{i=x}^yi\). 非常搞笑的题目,感觉难度远 ...
- 自定义 Word 模板
自定义 Word 模板 目录 必要设置 样式设置 标题样式 多级列表 封面 正文 引用目录 页码 页眉 图标 自定义模板保存 样式导入和导出 批量删除多余空白段落 必要设置 显示所有格式标记 选择&q ...
- 【GS文献】基因组选择在植物分子育种应用的最新综述(2020)
目录 1. 简介 2. BLUP类模型 3. Bayesian类模型 4. 机器学习 5. GWAS辅助的GS 6. 杂交育种 7. 多性状 8. 长期选择 9. 预测准确性评估 10. GS到植物育 ...