C++之map和set的基本操作

news2024/11/15 21:42:43

目录

set的基本操作

元素的插入

元素的遍历

元素的查找 

元素的删除

multiset的基本操作 

count接口

 元素的查找

元素的删除 

map的基本操作

元素的插入

 元素的遍历

元素的查找

元素的删除 

operator[ ]接口 

multimap的基本操作


在之前我们已经学过了vector,list,string和deque这些序列式容器,这些序列式的容器,本期我们要学习的是C++中的关联式容器,map和set。

set的基本操作

在上期我们学习了搜索二叉树,其实搜索二叉树有两种类型,分别是key模型可key_value模型。key模型判断的是在不在,key_value模型是在判断在不在的同时,还储存了其它的信息。

set其实就是搜索二叉树中的key模型。

元素的插入

代码和运行截图如下。

set的插入我们浅浅学习,在学习map时我们会深入讲解。 

元素的遍历

set是一个双向迭代器,支持++和--操作。

在插入元素之后我们用迭代器访问set的元素,我们插入了两个4但是最终在便利的时候发现只有一个四,且输出的元素的大小是按升序排列,也就意味着set的作用其实也就是排序加去重,迭代器本质的遍历也是二叉树的中序遍历。 

元素的查找 

find函数的返回值为一个迭代器类型,如果找到了当前的key值就返回当前key值所对应的节点的迭代器,如果找不到就返回end()。

 

元素的删除

set的删除可以传迭代器,可以传key值,也可以传迭代器区间进行删除。注意:在使用key值进行删除时,返回值为删除的key值的个数这个在set中其实并没有多大的用处,但是在multiset中有重大用处。 

multiset的基本操作 

multiset的基本操作和map类似,multiset和set的唯一区别就是multiset是不去重+排序,set是去重+排序。

count接口

在set中也有这个接口,用于统计set容器中某一元素的个数,但是在set中无非就是0或者1,所以我们不去关注此接口,但是在multiset中此接口大有用处。

 元素的查找

如果在multiset中查找元素,返回的也是迭代器,可是像上图中如果我们插入了三个4,那么返回的是哪一个4的迭代器呢?我们通过代码作为验证。 

通过代码和运行结果不难发现,最终打印了3个4,所以不难看出,find接口查找的key值,其实就是就是对应的key值在中序遍历中率先遍历的key值。 

元素的删除 

与set类似,但是因为mutiset允许相同的元素存在,所以在删除的时候尽量选取值删除而不是迭代器删除。

map的基本操作

map本质上就是搜索二叉树中的key_value模型。

元素的插入

 我们发现插入的元素的类型是value_type类型,value_type类型在文档中也有介绍。

 pair本质就是一个键值对,也是一个类,里面有两个成员,第一个成员为first,第二个成员为second,first即为key,second即为value。

我们可以直接创建一个pair对象进行插入,也可以通过make_pair函数创建pair对象。

 3个插入函数我们一般使用第一个insert函数,但是这个insert函数的返回值是一个pair类型的对象,这是什么意思呢?


我们知道map的作用其实也是排序+去重,所以当我们在插入元素时,相同的元素只允许插入一次,所以当我们在插入元素时,如果插入的元素在map中已经存在,所以就会插入不成功。返回值pair的第二个参数为bool类型,用于判断插入是否成功,第一个参数为迭代器类型,如果插入成功,则返回新插入的元素所在的节点的迭代器,如果插入失败,意味着当前的元素map中已经存在,则返回已经存在的元素所在的节点的迭代器。

这在后续理解[ ]的使用时,有重要意义。

 元素的遍历

map的迭代器也是一个双向迭代器。

元素的遍历我们可以使用迭代器进行遍历,也可以使用范围for进行遍历,但是范围for的本质就是迭代器。

元素的查找

与set类似。

元素的删除 

一般使用第二个删除接口,直接按照key值进行删除。

operator[ ]接口 

这个接口是用来干什么的呢?

有这样一个场景,公司一般会给员工在休闲时间送果盘,但是公司为了进一步提升员工对公司的满意度,想做这样一个调查,想统计每种水果果盘的使用数量,最终根据数量,合理的调整每种果盘的供给数量。代码和结果如下。

用上述代码确实可以统计出来各种水果的数量,但是这种方法太过麻烦,此时operator[ ]这个接口,就发挥了重要的作用。

我们先来看看这个接口的实现。

这个接口的返回值是什么,是pair对象的value的引用。上述用红色方框圈出来的就是函数的返回值,这个返回值怎么理解呢?

可以理解为,先往map中插入了对应的pair对象(key值就是我们要插入的key值,但是value的值我们给了匿名对象的值即空值),插入的结果成功与否我们可以通过insert的返回值pair对象的第二个参数获知,但是此时我们根本就不考虑插入是否成功,我们只需要插入之后的返回值pair对象的第一个参数,即迭代器,插入成功就是当前新插入的元素的对应节点的迭代器,插入失败意味着当前元素已经存在,所以返回已经存在的元素对应的节点的迭代器。然后解引用迭代器,返回对应的节点的pair对象的value的引用。

 通过上述知识点,我们可以对上述场景的代码做改进。

通过这种方式,我们也实现了各种水果的数量的统计。 

multimap的基本操作

multimap的基本操作和map类似。我们不再介绍,但是需要注意的是multimap中并不支持operator[]操作。

multimap的功能和muitiset类似,都是不去重+排序,这就意味着可以插入多个相同的key值,所以multimap的插入永远是成功的。此时的operator[ ]接口的返回值永远就是新插入的元素对应节点的pair对象的value对象,所以此时operator[ ]接口的存在就没有太大的存在意义。 

所以在multimap中并不支持operator[ ]接口。

以上便是map和set的所有基本操作。

本期内容到此结束^_^ 

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

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

相关文章

录屏新秀Top3 VS班迪录屏 ,谁更胜一筹?

现在是数字时代哈,录屏软件那可是咱生活和工作里特别重要的小玩意儿。比如说制作教学视频、搞游戏直播或者记录工作会议啥的,一款好的录屏软件能让咱效率高高的。今天呢,咱们就来对比一下新推出的三款录屏软件和那个老牌的班迪录屏&#xff0…

【一文读懂】NTN(非地面网络)技术介绍

一、引言 随着科技的飞速发展,全球通信需求日益增长,特别是在偏远地区或服务欠缺地区,传统的地面网络往往难以覆盖。为此,基于5G标准的卫星对地通信技术应运而生,构建了一个全新的通信领域——非地面网络(…

spring的xml配置文件爆红(原因以及解决办法)

1)出现这个原因是因为spring-framework依赖没有导入 可以看到依赖已经导入了 2)第二种原因:我们打开maven工程就是不出现右上角刷新的按钮,导致我们无法导入依赖 解决办法如下

书生大模型全链路开源开放体系笔记

书生哺语2.5概览 支持100万字上下文自助规划和搜索完成复杂任务(通过信息搜索和整合,针对复杂问题撰写专业回答,效率提升60倍) 可以提问文档中100万token中任何一个部分的问题,也有弊端就是不能联系上下文 核心技术思路 高质量合成数据 已经…

队列基础知识-Java

基本概念 队列(Queue)是一个有序的元素集合,其中新元素总是被添加到队尾,而删除操作则发生在队头。 这种特性使得队列成为一种线性数据结构,其操作遵循FIFO(先入先出)原则。 图解 环形队列注意点: 1 有效…

代码随想录算法训练营第54天|卡码网 110. 字符串接龙、105.有向图的完全可达性、106.岛屿的周长

1. 卡码网 110. 字符串接龙 题目链接:https://kamacoder.com/problempage.php?pid1183 文章链接:https://www.programmercarl.com/kamacoder/0110.字符串接龙.html 思路: 本题只需要求出最短路径的长度就可以了,不用找出具体路径…

解决面板安装Node.js和npm后无法使用的问题

使用面板(BT)安装Node.js和npm后,可能会遇到如下问题:即使成功安装了Node.js和npm,服务器仍提示“未安装”,在命令行中使用 node -v 或 npm -v 也没有任何响应。这种问题通常是由于环境变量配置错误或路径问…

Matlab中BaseZoom()函数实现曲线和图片的局部放大

BaseZoom工具下载链接: 链接:https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd9dyl 提取码:9dyl 下载完之后将工具包放置合适的路径下,并在matlab中“设置路径”中添加相应的路径; 注:可以先运行如…

【C++ Primer Plus习题】12.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "String.h"…

指针与一维数组

对于数组元素的访问&#xff0c;可以使用下标&#xff0c;也可以使用指针变量&#xff0c;移动指针可以指向数组中的任意一个元素。 例如&#xff0c;一维数组和指针的如下定义 int a [5] {1,2,3,4,5},*p;p a; 因为p是指向一维数组的首元素的指针。因此上述关系等价于 int…

第三天旅游线路规划

第三天&#xff1a;从贾登峪到禾木风景区&#xff0c;晚上住宿贾登峪&#xff1b; 从贾登峪到禾木风景区入口&#xff1a; 1、行程安排 根据上面的耗时情况&#xff0c;规划一天的行程安排如下&#xff1a; 1&#xff09;早上9&#xff1a;00起床&#xff0c;吃完早饭&#…

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录 [web][极客大挑战 2019]Http 考点&#xff1a;Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点&#xff1a;弱密码字典爆破 四种方法&#xff1a; [web][极客大挑战 2019]Http 考点&#xff1a;Referer协议、UA协议、X-Forwarded-For协议 访问…

matlab读取NC文件(含group)

matlab读取NC文件&#xff08;含group&#xff09;&#xff1a; NC文件数据结构&#xff1a; 代码&#xff1a; % 打开 NetCDF 文件 filename your_file.nc; % 替换为你的文件名% 使用 netcdf.open 函数打开文件 ncid netcdf.open(filename, NC_NOWRITE);% 查看文件中的组 …

JAVA - 关于防重复提交探讨

1、前端提交按钮做单次点击 2、后端接收判断请求的数据包&#xff0c;生成唯一key存redis&#xff0c;设置几秒的过期时间&#xff08;缺陷&#xff1a;带时间戳的数据&#xff0c;需要做些逻辑判断&#xff09; 3、后端代码逻辑redis分布式锁&#xff08;缺陷&#xff1a;re…

说一下解除docker限制内存警告

有时候docker要对容器使用的内存做出限制&#xff0c;通常的做法是使用参数 -m 例如&#xff1a; docker run -m 512M表示容器内存最大不能超过512M。 但这样做&#xff0c;在ubuntu会看到以下警告 WARNING: Your kernel does not support swap limit capabilitiesdocker官方…

ELK笔记

要搞成这样就需要钱来买服务器 开发人员一般不会给服务器权限&#xff0c;不能到服务器上直接看日志&#xff0c;所以通过ELK看日志。不让开发登录服务器。即使你查出来是开发的问题&#xff0c;费时间&#xff0c;而且影响了业务了&#xff0c;就是运维的问题 开发也不能登录…

从零开始学习JVM(七)- StringTable字符串常量池

1 概述 String应该是Java使用最多的类吧&#xff0c;很少有Java程序没有使用到String的。在Java中创建对象是一件挺耗费性能的事&#xff0c;而且我们又经常使用相同的String对象&#xff0c;那么创建这些相同的对象不是白白浪费性能吗。所以就有了StringTable这一特殊的存在&…

用EA和SysML一步步建模(05)使命声明-解构需求01

用EA和SysML一步步建模的操作指南&#xff08;01&#xff09; 用EA和SysML一步步建模&#xff08;02&#xff09;导入ISO-80000 用EA和SysML一步步建模&#xff08;03&#xff09;创建包图和包的关系 用EA和SysML一步步建模&#xff08;04&#xff09;创建“需求组织”包图 …

【PHPStudy搭建Pikachu靶场】自定义网站站点和mysql端口本地搭建Pikachu靶场

文章目录 1. 下载phpstudy和pikaqu源码2. 打开phpstudy&#xff0c;启用apache和mysql3. Phpstudy用自定义的82端口创建网站4. 创建数据库5. 修改apache的端口和网站根目录6. 修改mysql的端口和服务序列号7. 用浏览器打开靶场8. 修改pikachu的config.inc.php文件9. 在浏览器上打…