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的更多相关文章

  1. C++STL标准库学习笔记(五)set

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

  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网络库学习笔记(三)TimerQueue定时器队列

    目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...

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

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

  7. STL标准库-容器-set与map

    STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...

  8. openresty 学习笔记三:连接redis和进行相关操作

    openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...

  9. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

随机推荐

  1. go微服务框架Kratos笔记(一)入门教程

    kratos简介 Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关功能及工具 本文基于kratos v2.0.3,windows平台,其他系统平台均可借鉴参考 环境搭建 Golang开发 ...

  2. Numpy (嵩老师.)

    import numpy as np Numpy 一元函数 对ndarray中的数据执行元素级运算的函数 np.abs(x) np.fabs(x) 计算数组各元素的绝对值 np.sqrt(x) 计算数 ...

  3. python-内置函数(搭配lambda使用)

    目录 常用的内置函数 需要注意的知识点: enumerate()函数 map()函数 zip()函数 filter()函数 reduce()函数 sum()函数 max()/ min()函数 sort ...

  4. BootStrap中模态框踩坑

    在模态框中使用html标签上的自定义属性来打开模态框后,在使用JS关闭模态框,就会出现多层蒙板问题 出现这个问题的原因就是没有仔细看bootstrap的官方文档,我人麻了,搞了好久 务必将模态框的 H ...

  5. Ubuntu压缩和解压缩

    1.常用的压缩格式 tar tar.bz2 tar.gz 2.gzip压缩 gzip xxx //压缩 gzip -d xxx.gz //解压缩 gzip对文件夹的压缩 gzip -r xxx //文 ...

  6. mybatis判断集合长度

    使用mybatis框架在写sql的时候碰到一个异常: 1064 - You have an error in your SQL syntax; check the manual that corres ...

  7. CF1539F Strange Array

    这玩意为啥是紫. 考虑对每个小于\(x\)的数值设为1,大于\(x\)的数值设为-1. 那么对于答案要求的就是绝对值最大的连续段. 线段树是很显然的. 考虑我们不能对每个数都进行一遍重构,这样就退化到 ...

  8. CF#581 (div2)题解

    CF#581 题解 A BowWow and the Timetable 如果不是4幂次方直接看位数除以二向上取整,否则再减一 #include<iostream> #include< ...

  9. 【宏组学】如何根据taxid(或taxname)快速获得taxname(或taxid)?

    需求 我有一个物种taxonomy ID的list,想获得相应的物种名,不要一个个去NCBI Taxonomy官网查.反之根据物种名list查询对应的taxid. 实现 因为之前没怎么用过,我的第一个 ...

  10. 给lua_close实现回调函数

    先讲下为什么会需要lua_close回调吧. 我用C++给lua写过不少库,其中有一些,是C++依赖堆内存,并且是每一个lua对象使用一块单独的内存来使用的. 在之前,我一直都是魔改lua源代码,给l ...