C++ STL——map和set的使用

news2024/12/26 14:01:03

在这里插入图片描述

文章目录

  • 1. 关联式容器
    • 1.1 键值对
    • 1.2 树形结构的关联式容器
  • 2. set
    • 2.1 set的介绍
    • 2.2 set的插入
    • 2.3 set的删除和查找
    • 2.4 lower_bound和upper_bound
  • 3. multiset
    • 3.1 count
  • 4. map
    • 4.1 map的介绍
    • 4.2 map的插入
    • 4.3 map的遍历
    • 4.4 map的[ ]
  • 5. multimap

1. 关联式容器

我们之前学的vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。

那什么是关联式容器?它与序列式容器有什么区别
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高

1.1 键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息

1.2 树形结构的关联式容器

根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。

2. set

2.1 set的介绍

在这里插入图片描述
set的模板参数说明:
第一个参数是set中存放元素的类型,实际在底层存储<key, value>的键值对,第二个是一个比较器(默认小于),第三个是一个空间适配器(以后再说)

解释说明
1. set是按照一定次序存储元素的容器
2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
4. set在底层是用二叉搜索树(红黑树)实现的。

当我们想用二叉搜索树key模型时就可以使用set了。

2.2 set的插入

在这里插入图片描述
在这里插入图片描述
set里面重定义的key_type和value_type代表的是T

使用如下:
在这里插入图片描述
我们可以看出:打印出来的结果是经过排序和去重的。set的插入迭代器不会发生失效问题。

2.3 set的删除和查找

在这里插入图片描述
这里删除的第二个函数的返回值意思是:你成功删除了多少个。因为这个set里面是去重的,而后面有一个不去重的版本。

要删除前,我们需要一个函数查找:
在这里插入图片描述
我们来看一下它的返回值:
在这里插入图片描述
找到了就返回位置的迭代器,没找到就返回迭代器的end()。这个set里面的find函数时间复杂度是O(logN),而在算法里有一个暴力查找的时间复杂度是O(N)。

使用如下:
在这里插入图片描述

2.4 lower_bound和upper_bound

在这里插入图片描述
这个函数是什么意思呢?我们来看下面的代码:
在这里插入图片描述
从结果我们来看:返回>= val位置迭代器 。3返回3位置 ,6 返回7位置。
这个函数的应用场景可以删除>=x的所有值:
在这里插入图片描述
在这里插入图片描述
那么upper_bound是什么情况呢?
在这里插入图片描述
返回>val位置迭代器 。3返回4位置 ,6返回7位置。

3. multiset

在这里插入图片描述
它和set包含的是同一个头文件。不同的区别是:它插入的数据可以重复
在这里插入图片描述

3.1 count

在这里插入图片描述
这个count函数是统计这个树里有多少个。set也有这个函数,但是set是不重复的,所以只会出现0或1。而这个multiset是可以重复的,那么erase函数的返回值也有作用了。
在这里插入图片描述
然后multiset的find函数它找的是中序遍历的第一个结点的迭代器

4. map

4.1 map的介绍

在这里插入图片描述
map的模板参数说明:
key: 键值对中key的类型。
T: 键值对中value的类型。
Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)。
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器

解释说明
1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。
2. 在map中,键值key通常用于排序和唯一标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:typedef pair<const key, T> value_type。
3. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
4. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

如果我们想使用KV模型的时候,我们可以使用map(防重复)。

4.2 map的插入

在这里插入图片描述
在这里插入图片描述
map里面重定义的value_type是一个结构pair。我们可以看一下这个pair在STL里面是怎么定义的:
在这里插入图片描述
使用如下:
在这里插入图片描述
这是三种构造方式。make_pair是一个函数模板:
在这里插入图片描述
使用这个函数我们就不需要写参数了。

返回值的意义:
在这里插入图片描述
这句话的意思是:返回一个pair,第一个参数first被设置成一个迭代器指向新插入的位置,如果key存在,那么就指向已经存在位置的迭代器。第二个参数second,如果成功插入返回真,如果key存在返回假

4.3 map的遍历

在这里插入图片描述
从这里我们可以看出迭代器it不能直接解引用。因为这里我们是用pair这个结构体把key和value包含在一起了。所以这里的*it是pair这个结构体。我么可以这样:
在这里插入图片描述
如果使用auto,我们需要这样写:
在这里插入图片描述

4.4 map的[ ]

之前我们写过统计一个东西出现的次数,那么这里我们也可以使用map了。
在这里插入图片描述
然后根据我们学的insert返回值,其实我们可以再优化一下。因为如果我们插入一个不存在的时候,find会查找一遍。然后进入else时,insert又会查找一遍。我们可以这样改:
在这里插入图片描述
那么方括号[ ],我们可以这样使用:
在这里插入图片描述
这是为什么?我们先来看一下map的[ ]:
在这里插入图片描述
在这里插入图片描述
这里的key_type是string,mapped_type是int。源码如下:
在这里插入图片描述
这个mapped_type()是value的匿名构造。然后就是调用了insert,它的返回值是pair<iterator,bool>,调用了first就是iterator,解引用后调用second就是value。如果我们要插入的key在map中,我们可以查找并修改value。因为它的返回值是引用如果我们要插入的key不在map中,我们可以插入并修改value。

5. multimap

在这里插入图片描述
它和map包含的是同一个头文件。不同的区别是:它插入的数据可以重复
相比map,multimap最大的区别是它不接受方括号的使用
在这里插入图片描述
可以看出插入的返回值也不是pair了,而是新插入位置的迭代器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测

时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测 目录时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测预测效果基本介绍研究回顾程序设计参考资料预测效果 基本介绍 CNN-SVM预测模型将深度学习模型作为特征学习器&#xff0c;将SVM 支持向量机 作为训练器进行…

基于分布鲁棒联合机会约束的能源和储备调度(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

2023.2.15工作学习记录 git Docker compose容器编排

关于Git错误提交了target目录 是因为在ignore目录中没有加入biz这个工程 以后提交代码时一定要检查好自己提交的代码 首先把所有的全部取消 然后再根据自己要提交的内容一个个来勾选 Docker网络 container模式&#xff1a;新建的容器和已经存在的一个容器共享一个网络…

【大数据】HADOOP-YARN容量调度器Spark作业实战

目录需求配置多队列的容量调度器验证队列资源需求 default 队列占总内存的40%&#xff0c;最大资源容量占总资源的60% ops 队列占总内存的60%&#xff0c;最大资源容量占总资源的80% 配置多队列的容量调度器 在yarn-site.xml里面配置使用容量调度器 <!-- 使用容量调度器…

从 ELMo 到 ChatGPT:历数 NLP 近 5 年必看大模型

目录AI21 LabsAlibabaAllen Institute for AIAmazonAnthropicBAAIBaiduBigScienceCohereDeepMindEleutherAIGoogleHuggingfaceiFLYTEKMetaMicrosoftNVidiaOpenAISalesforceTsinghua UniversityUC BerkeleyYandex持续更新中 ...参考团队博客: CSDN AI小组 先上 “万恶之源”&…

物联网在智慧农业中的应用

随看现代科技的不断发展&#xff0c;近年来我国农业的进步是显而易见的。从八九十年代农业生产以人力为主&#xff0c;到之后的机械渐渐代替人力&#xff0c;再到如今物联网技术在农业领域的应用&#xff0c;多种前沿技术应用于农业物联网&#xff0c;对智慧农业生产的各个环节…

阿里云_山东鼎信短信的使用(云市场)

目录山东鼎信API工具类随机验证码工具类进行测试Pom依赖(可以先导入依赖)创建controllerSmsServiceSmsServiceImplswagger测试(也可以使用postman)山东鼎信API工具类 山东鼎信短信官网 找到java的Api&#xff0c;复制下来 适当改了一下&#xff0c;为了调用(类名SmsUtils) p…

GEE学习笔记 七十二:【GEE之Python版教程六】命令行简介

这篇开始就要讲解GEE相关的内容&#xff0c;首先聊一下命令行的内容&#xff0c;这个在官方文档中有详细的介绍&#xff0c;这里我简单说一下常用的几个命令&#xff0c;剩余的大家在使用过程中如果又需要可以随时查看相关官方文档的介绍。官方文档地址&#xff1a;https://dev…

pcie link training

有机会用瑞芯微做EP&#xff0c;X86做RC &#xff0c;调试两者建立连接。环境配置如图所示&#xff0c;两块单板&#xff0c;期望瑞芯微做EP&#xff0c;X86做RC&#xff0c;两者能够互联。LINK 配置过程主要配置瑞芯微瑞芯微的芯片配置&#xff0c;在配置EP模式时&#xff0c;…

5.2 BGP水平分割

5.2.2实验2&#xff1a;BGP水平分割 1. 实验目的 熟悉BGP水平分割的应用场景掌握BGP水平分割的配置方法 2. 实验拓扑 实验拓扑如图5-2所示&#xff1a; 图5-2&#xff1a;BGP水平分割 3. 实验步骤 &#xff08;1&#xff09;配置IP地址 R1的配置 <Huawei>…

GEE学习笔记 七十五:【GEE之Python版教程九】数值

这章介绍一下数值类型&#xff0c;数值在python中可以分为&#xff1a;整型、浮点型、复数等&#xff0c;在GEE中我们常用的就是整形和浮点型数据。 这段代码是在程序之前必须执行的&#xff0c;用来注册GEE。 import ee ee.Initialize() 1、数值的API 首先看一下GEE的pytho…

一文读懂select、poll、epoll的用法

select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就通过一种机制&#xff0c;可以监视多个描述符&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者写就绪&#xff09;&#xff0c;能够通知程序进行相应的读写操作。但select&#xff0c;…

一些有用的shell命令盘点

1、ssh 说明&#xff1a; ssh命令是经常用来连接服务器的&#xff0c;如何使用ssh命令连接服务器是一个后端开发必备的技能&#xff0c;当你需要查看服务器上日志等信息时&#xff0c;就需要使用该命令来登录到服务器进行查看。 使用&#xff1a; ssh $USERNAME$IP例如&#…

Python程序打包exe可执行软件教程

1、前言Python虽好&#xff0c;但是平时我们写的代码都是.py脚本文件&#xff0c;必须要在Python环境下 才可以运行。如果一台电脑没有安装Python是无法运行我们的程序的。当然你也可以选择随身携带安装包。 不过终究是有些麻烦。那么有没有什么办法&#xff0c;能把我们编写的…

【扬尘监测系统】让扬尘管理迈向“智慧化”

扬尘是指道路与管线施工、物料运输、物料堆放、植物栽种和养护等活动产生的粉尘颗粒物对大气造成的污染。 治理扬尘污染&#xff0c;我们应该从源头出发&#xff0c;进行“防治”。扬尘监测系统是利用现代科学技术对扬尘的排放程度进行客观、科学、准确的量化和评价的设备&…

零信任-易安联零信任介绍(11)

​目录 ​易安联零信任公司介绍 易安联零信任发展路线 易安联零信任产品介绍 易安联零信任架构 易安联零信任解决方案 易安联零信任发展展望 易安联零信任公司介绍 易安联是一家专业从事网络信息安全产品研发与销售&#xff0c;是行业内领先的“零信任”解决方案提供商&…

ChatGPT或将引发新一轮失业潮?是真的吗?

最近&#xff0c;要说有什么热度不减的话题&#xff0c;那ChatGPT必然榜上有名。据悉是这是由美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;并协助人类…

6.2 构建 RESTful 应用接口

第6章 构建 RESTful 服务 6.1 RESTful 简介 6.2 构建 RESTful 应用接口 6.3 使用 Swagger 生成 Web API 文档 6.4 实战&#xff1a;实现 Web API 版本控制 6.2 构建 RESTful 应用接口 6.2.1 Spring Boot 对 RESTful 的支持 Spring Boot 提供的spring-boot-starter-web组件完全…

Pygame中画圆

在Pygame中&#xff0c;可以通过draw模块下的circle()函数来进行画圆。1 准备工作的完成在画圆之前需要导入Pygame模块、初始化Pygame模块以及创建Surface对象。import pygame from pygame.locals import * pygame.init() screen pygame.display.set_mode((600,500))其中&…

SpringBoot实现 内置 定时 发送邮件功能

前段时间因为公司用了定时任务&#xff0c;所以写了2篇定时任务的文章&#xff0c;一篇是正常如何在Springboot 编程中如何去使用quartz &#xff0c;第二篇就是 正常业务性的增删改查&#xff0c;今天我们来看下如何使用 quartz 去定时给女朋友发邮件 &#xff0c;结尾会放上完…