map的使用(c++)
在了解map之前,我们先看看两个场景,通过这两个场景的对比,让我们知道为什么要存在存储双关键字的容器
场景一:判断一堆字符串中,某一个字符串是否出现过
在没学set容器之前,我们只能想到把这一堆字符串存到一个字符型数组里面,从前往后遍历每一个字符,判断某一个字符串是否出现过,这个时间复杂度是O(N)级别的,如果我们学过set的话,我们就可以把这一堆字符串存到set容器里面,判断某一字符串是否出现过的时候直接调用里面的count接口就可以了,时间复杂度是O(logN)级别的,所以我们用set特解决场景一问题的时候,时间复杂是更优的
场景二:找出一堆字符串中,某一个字符串出现的次数
如果找的是次数,那么set容器就用不了了,set容器存储的是单关键字,而且里面是不能有重复元素的,大家可能想到有multiset,它可以存储重复的元素,因此要判断某一个字符串出现的次数,直接调用multiset里面的count不就完了吗?其实还有一个问题,如果这一堆字符串中,所有的字符全都长一样,比如有10,000个字符串里面的每个字符都是a,当我想找“aa”这个字符串出现的次数的时候,用multiset来解决的话是要遍历整个红黑树一遍的,要全部把它扫描一遍才能统计出a次数,此时它的时间复杂度是O(N)级别的,那和数组存储没有任何的差别,所以我们想判断某一个字符串出现的次数是不能用set容器的
此时存储双关键字的map就登场了,它可以做到存储双关键字,它把两个关键词绑定在一起,存到红黑树里面的,比如在这个问题里面,我想统计某一个字符串出现的字数,map绑定的两个关键字可以设置成,第一个是string第二个是int,它的意思是把字符串和出现的次数绑定在一起,放进红黑树里面的一个一个节点中,也就是说红黑树的节点存的是一个结构体,结构体的第一个关键字是字符串,第二个是字符串出现的次数,此时在查找某一个字符串出现的次数的时候,直接在这个红黑中找出对应的字符串,拿到它出现的次数就可以了,至于如何解决这样的一个问题,我们学完map的方式之后,在一起编写代码
map / multimap
map 与 multimap 的区别: map 不能存相同元素, multimap 可以存相同的元素,其余的使⽤⽅式完全⼀致。因此,这⾥只练习使⽤ map 。 map 与 set 的区别: set ⾥⾯存的是⼀个单独的关键字,也就是存⼀个 int 、 char 、 double 或者 string 。⽽ map ⾥⾯存的是⼀个 pair<key, value> ,(k-v 模型)不仅有⼀个关键字,还会有⼀个与关键字绑定的值,⽐较⽅式是按照 key 的值来⽐较。 也就是中序遍历的结果是按照第一个关键字的的大小来做比较的;可以这样理解:红⿊树⾥⾯⼀个⼀个的结点都是⼀个结构体,⾥⾯有两个元素分别是 key 和 value 。插⼊、删除和查找的过程中,⽐较的是 key 的值。
- 存 <int, int> ,来统计数字出现的次数;
- 存 <string, int> ,来统计字符串出现的次数;
- 存 <string, string> ,表⽰⼀个字符串变成另⼀个字符串;
- 甚⾄存 <int, vector<int>> 来表⽰⼀个数后⾯跟了若⼲个数......,可以用来存储树,就是一个根结点,后面跟了一堆孩子,int表示根,vector<int>存它的一堆孩子,但用map存储树的效率不高,因为查找的时间复杂是O(logN),后面我们在学习哈希表的时候,可以给大家演示一下如何用这个东西存储树,因为用哈希表来存储这样的形式,查找是很快的
1 创建 map
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{ map<int, int> mp1; map<int, string> mp2; map<string, int> mp3; map<int, vector<int>> mp4; // 甚⾄可以挂⼀个 vectorreturn 0;
}
2 size / empty
- size :求红⿊树的⼤⼩。时间复杂度: O(1) 。
- empty :判断红⿊树是否为空。时间复杂度: O(1) 。
3 begin / end
- 迭代器,可以使⽤范围 for 遍历整个红⿊树。
- 遍历是按照中序遍历的顺序,因此是⼀个有序的序列。
4 insert
- 向红⿊树中插⼊⼀个元素。这⾥需要插⼊⼀个 pair,可以⽤ {} 形式。⽐如: mp.insert({1, 2}) 。时间复杂度: O(log N) 。
5 operator []
- 重载 [] ,使得 map 可以像数组⼀样使⽤。
- 这是 map 最好⽤的接⼝,有了这个重载,map 的使⽤就变得特别轻松,不⽤写很多冗余的代码。
- 它的底层其实就是调⽤了 insert 函数,并且会返回 val 的引⽤。我们⽬前就先学会使⽤即可。
6 erase
- 删除⼀个元素。时间复杂度: O(log N) 。
7 find / count
- find :查找⼀个元素,返回的是迭代器。时间复杂度: O(log N) 。
- count :查询元素出现的次数,⼀般⽤来判断当前元素是否在红⿊树中。时间复杂度:O(log N) 。
8 lower_bound / upper_bound
- lower_bound :⼤于等于 x 的最⼩元素,返回的是迭代器。时间复杂度: O(log N) 。
- upper_bound :⼤于 x 的最⼩元素,返回的是迭代器。时间复杂度: O(log N) 。
代码:
#include <iostream>
#include <map>
#include <string>
using namespace std;//传引用使得mp不需要拷贝
void print(map<string, int>& mp)
{//&避免拷贝//双关键字用auto提取出来的是一个pair类型,所以打印要用first、secondfor (auto& p : mp){cout << p.first << " " << p.second << endl;}
}void test1()
{map<string, int> mp;//插入mp.insert({ "张三", 1 });mp.insert({ "李四", 2 });mp.insert({ "王五", 3 });print(mp); //打印出来的结果按第一个关键字作比较,后面的关键字只起到绑定作用//李四 2//王五 3//张三 1//operator[] 可以让 map 像数组一样使用int a[2] = { 1,2 };a[1] = 4;cout << a[1] << endl; //4cout << mp["张三"] << endl; //1mp["张三"] = 110;cout << mp["张三"] << endl; //110// 注意事项:operator[] 有可能会向 map 中插入本不想插入的元素if (mp["赵六"] == 4) cout << "yes";else cout << "no" << endl; //no//虽然我们只是想判断赵六存不存在,但是一旦调用了[],就把赵六插入进来了// [] 里面的内容如果不存在 map 中,会先插入,然后再拿值// 插入的时候:第一个关键字就是 [] 里面的内容,第二个关键字是一个默认值print(mp);//李四 2//王五 3//张三 110//赵六 0//这样的逻辑去写就没有插入张飞,从mp.count("张飞")这句话就断掉了//后面的语句没有执行了,此时打印张飞是不存在map里的if (mp.count("张飞") && mp["赵六"] == 4) cout << "yes" << endl;else cout << "no" << endl; //noprint(mp);cout << endl;//李四 2//王五 3//张三 110//赵六 0//删除mp.erase("张三");print(mp);cout << endl;//李四 2//王五 3//赵六 0//auto x = mp.lower_bound("李四");map<string, int>::iterator x = mp.lower_bound("李四");cout << x->first << " " << x->second << endl; //李四x = mp.upper_bound("李四");cout << x->first << " " << x->second << endl; //王五
}// 统计一堆字符串中,每一个字符串出现的次数
void fun()
{string s;map<string, int> mp; // <字符串,字符串出现的次数>for (int i = 1; i <= 5; i++){cin >> s;mp[s]++; // 体现了 operator 的强大,s字符串不存在会先插入 }print(mp);//输入//sdf//aa//dd//aa//dd//输出//aa 2//dd 2//sdf 1
}int main()
{test1();//fun();return 0;
}
相关文章:
map的使用(c++)
在了解map之前,我们先看看两个场景,通过这两个场景的对比,让我们知道为什么要存在存储双关键字的容器 场景一:判断一堆字符串中,某一个字符串是否出现过 在没学set容器之前,我们只能想到把这一堆字符串存到…...
毕业设计—基于Spring Boot的社区居民健康管理平台的设计与实现
🎓 毕业设计大揭秘!想要源码和文章?快来私信我吧! Hey小伙伴们~ 👋 毕业季又来啦!是不是都在为毕业设计忙得团团转呢?🤔 别担心,我这里有个小小的福利要分享给你们哦&…...
Python:蟒蛇绘制(一笔画)
一、题目要求 使用turtle库,绘制一个蟒蛇形状的图形。 二、代码展示 # 请在下方开始编写你的代码 import turtle turtle.setup(650,350,200,200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pensize(25) turtle.pencolor("purple") turt…...
mysql查询判断函数,类似decode
mysql中没有decode函数,如果使用的话,会报如下错误:Error Code: 1305. FUNCTION stockdb.decode does not exist 如果要实现像 Oracle 数据库那样原生的 DECODE 函数,可以通过以下几种方式来实现类似 DECODE 函数的功能。 -- 创建…...
异常处理、事务管理
异常处理 程序开发过程中不可避免的会遇到异常现象 如何处理 方案一:在Controller的方法中进行try...catch处理(代码臃肿,不推荐) 方案二:全局异常处理器 全局异常处理器 RestControllerAdvice :定义全…...
UART(一)——UART基础
一、定义 UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。 功能和特点 基本的 UART 系统只需三个信号即可提供稳健的中速全双工…...
MySQL 中各种日志简介
MySQL 日志 慢查询日志(Slow query log) 慢查询⽇志由执⾏时间超过系统变量 long_query_time 指定的秒数的SQL语句组成,并且检 查的⾏数⼤于系统变量 min_examined_row_limit 指定值。被记录的慢查询需要进⾏优化, 可以使⽤mysqldumpslow客⼾端程序对慢…...
【每日论文】Text-guided Sparse Voxel Pruning for Efficient 3D Visual Grounding
下载PDF或者阅读论文,请点击查看:LlamaFactory - huggingface daily paper - 每日论文解读 | LlamaFactory | LlamaFactory 摘要 中文 在这篇论文中,我们提出了一种高效的多级卷积架构,用于3D视觉定位。传统的由于采用两阶段或基…...
Kylin server v10部署docker
这里不用写什么标题 1. docker环境1.1 docker-ce1.1.1 yum安装1.1.2 离线安装 1.2 docker-compose 2. 镜像载入3. 服务启停4. 其他 1. docker环境 1.1 docker-ce docker-ce是社区版docker服务,可以通过yum方式直接安装或者离线安装,在国产化环境中&…...
计算机之就业主流岗(Mainstream Computer Employment Positions)
计算机之就业主流岗 计算机行业一直以来都是就业市场中的热门领域,技术岗位种类繁多,但每个岗位都有自己的核心技能和职责方向。以下是计算机行业中主流的技术岗位及其特点介绍,帮助你更清晰地了解这些职业的内容和发展前景。 1. 后端开发 …...
DeepSeek 助力 Vue 开发:打造丝滑的日期选择器(Date Picker),未使用第三方插件
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
【Mac技巧】添加DNS解析到hosts文件
【Mac技巧】添加DNS解析到hosts文件 Add DNS Resolution to hosts on Mac 我们通常访问一个Web站点(即网址),需要输入网址关键字(例如: 太平洋汽车网),或者输入pcauto.com.cn即可。 这期间仅…...
【批判性思维有什么用?】
1.批判性思维,指的是在人格平等的状态下,对自己和他人观点做谨慎多角度地思考。它讲究逻辑和理性,是一种高效地积累知识的方法。 2.只有那些我们完全不熟悉的结论和我们已经熟悉得不能再熟悉的结论,对它们的反思,才能…...
Golang学习笔记_34——组合模式
Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 Golang学习笔记_33——桥接模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 文件系统2. 图形界面3. 组织架构 四、代码示例(Go语言)五、…...
以太网详解(八)传输层协议:TCP/UDP 协议
文章目录 传输层协议概述为什么需要传输层?传输层功能网络层与传输层在实现 “端到端” 传输的异同两类服务:面向连接/无连接服务 传输控制协议 TCPTCP 协议数据单元格式TCP 的重传机制快重传和快恢复快重传举例快恢复算法 用户数据报协议 UDPUDP 概述UDP 基本工作过…...
基于Spark抖音评论舆情分析系统
✔️情绪分析、文本挖掘、文本分类,词频统计、情感分析,词云制作,词语共现网络图、人物关系网络建立等 ✔️主营:指导解答anaconda、python数据分析、数据挖掘、词频统计、词云、情感分析、python机器学习、Flask Django web、jup…...
JAVA系列之数组的秘密(数组的一般用法+力扣 斯坦福大学练习精解)
大佬们好呀~ 更多精彩: 个人主页 JAVA专栏 文章目录 一、数组的概述1.1什么是数组?1.2注意:1.3建议: 二、数组的定义1.格式: 三、数组的静态初始化1.数组的初始化:2.静态初始化:格式:数组的长度:…...
探索飞鹤奶粉奥秘,领会科技魅力
在科技迅猛发展的当下,AI 技术正深刻重塑各行业格局。乳制品行业亦不例外。近日,长江商学院「AI 未来空间站」的同学们深入走访了飞鹤集团,探寻其在数字化浪潮中的创新实践与卓越成就。 在飞鹤的智能化生产车间,同学们目睹了高度自…...
【数据仓库】StarRocks docker部署
StarRocks docker部署 一、环境准备安装 docker 及 docker-compose操作系统相关禁用及配置【CentOS Linux 7 (Core)】 二、StarRocks-v2.5【存算一体,3FE,3BE】BE节点配置FE节点配置服务启动BE节点添加FE 节点添加 三、监控(待完善)四、VIP Nginx Keepalived(待完善)五、Star…...
Java虚拟机面试题:内存管理(下)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
RKNN开发环境搭建2-RKNN Model Zoo 环境搭建
目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程. 本…...
