IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C++STL标准库学习笔记(三)multiset -> 正文阅读

[数据结构与算法]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()时刚好退出)

????????对迭代器 ++ ,其就指向容器中下一个元素,-- 令其指向上一个元素。

样例:

#include<iostream>

#include<cstring>

#include<set>//使用multiset和set需要

using?namespace?std;

int?main(int?argc, char?const?*argv[])

{

? ? multiset<int>st;

? ? int?a[10] = {1,14,12,13,7,13,21,19,8,8};

? ? for?(int?i?= 0; i?< 10; i++)

? ? {

? ? ? ? st.insert(a[i]);//插♂入的是a[i]的复制品

? ? }

? ? multiset<int>::iterator?i;//迭代器,近似于指针

? ? for?( i?=?st.begin(); i?!=?st.end(); i++)

? ? {

? ? ? ? cout<<*i<<",";//输出:1,7,8,8,12,13,13,14,19,21,

? ? }

? ? cout<<endl;

? ? i?=?st.find(22);//查找22,返回值是迭代器

? ? if?(i?==?st.end())//查找不到则返回值为end()

? ? {

? ? ? ? cout<<"Not Found"<<endl;//输出:Not Found

? ? }

? ? st.insert(22);//插入22

? ? i?=?st.find(22);

? ? if?(i?==?st.end())

? ? {

? ? ? ? cout<<"Not Found"<<endl;

? ? }

? ? else

? ? {

? ? ? ? cout<<"Found:"<<*i<<endl;//输出:Found:22

? ? }//找到则返回指向找到的元素的迭代器



? ? i?=?st.lower_bound(13);

? ? //返回最靠后的迭代器it,使得[begin,it)中的元素

? ? //都在13前面,复杂度log(n)

? ? cout<<*i<<endl;//结果:13

? ? i?=?st.upper_bound(8);

? ? //返回最靠前的迭代器it,使得[it,end())中的元素

? ? //都在8后面,复杂度log(n)

? ? cout<<*i<<endl;//结果:12

? ? st.erase(i);//删除迭代器i指向的元素,即12

? ? for?( i?=?st.begin(); i?!=?st.end(); i++)

? ? {

? ? ? ? cout<<*i<<",";//输出:1,7,8,8,13,13,14,19,21,22,

? ? }

? ?

? ? return?0;

}

程序中部分重要的地方单独拎出来强调:

????????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标准库内容,其他内容看到函数名就会用了。感谢大家读到这里,祝大家健康快乐吉祥如意恭喜发财学业有成早生贵子年年有余,以及头发茂密,下篇博客再见拜拜。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-10 11:18:39  更:2021-12-10 11:20:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 23:33:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码