数据结构之map

map的基本介绍

我们常常把map称之为映射,就是将一个元素(通常称之为key键)与一个相对应的值(通常称之为value)关联起来,比如说一个学生的名字(key)有与之对应的成绩(value),它们是一一对应的,就好像一把钥匙开一扇门,在map中键是唯一的,也只有唯一的确定的值。

在C++中,map提供了以下三种数据结构,其底层实现以及优劣如下表所示:

(注意:map中键是唯一的,但是multimap则没有此限制)

映射底层实现是否有序数值是否可以重复
std::map红黑树key有序key不可重复
std::multimap红黑树key有序key可重复
std::unordered_map哈希表key无序key值不可重复

std::unordered_map的key值存储是无序的,底层实现为哈希表,查找速度更快,如果不需要排序而只是快速查找键对应的值,可以考虑使用。

std::mapstd::multimap的底层实现是红黑树,它的key值存储是有序的,如果需要对键值对自定义排序,可以使用std::map

map的使用

使用映射容器需要引入头文件<unordered_map>或者<map>

//引入unordered_map头文件,包含unordered_map类型
#include <unordered_map>
//引入map头文件,包含map类型和multimap类型
#include <map>

想要声明map映射关系,需要指定键的类型和值的类型。

//声明一个整数类型映射到整数类型的 无序映射
unordered_map<int,int> uMap;
//声明一个将字符串映射到整数的'map',可以这样声明
map<string,int>myMap;

想要插入键值对key-value,需要使用insert()函数或者使用[]操作符来插入。如果键不存在,[]操作符将会创建一个新的键值对,将其插入到map中,并将值初始化为默认值(对于整数来说,默认值为0)。

uMap[0]=10;
uMap[10]=0;uMap["math"]=100;
uMap["english"]=80;

和set类似,可以使用find函数来检查某个键是否存在于map中,它会返回一个迭代器。如果键存在,迭代器指向该键值对,否则指向map的末尾。

if(myMap.find("math")!=myMap.end()){//键存在
}else{//键不存在
}

你可以使用范围for循环来遍历map中的所有的键值对,进行各种操作。

for(const pair<int,int>&kv:umap){
}

当使用范围for循环遍历map时,我们需要声明一个变量kv来存储每键值对,这个变量的类型通常是pair类型,下面就让我们来详细的解释一下const pair<int,int>&kv:umap

const用于声明一个不可修改的变量,这意味着一旦变量被初始化,就不能再修改其值。常量通常用大写字母表示。

注:因为const声明的变量一旦创建后就无法修改值,所以必须初始化。

const double PI=3.1415926;

在这里,const关键字表示你只能读取容器中的元素,而不能修改他们。

而pair<int,int>定义了kv也就是键值对的数据类型是pair,C++中的pair类型会将两个不同的值组合成一个单元,常用于存储键值对,创建pair的时候,也必须提供两个类型名,比如上面的pair对象,两个值的类型都是int,在使用时通过first和second成员来访问pair中的第一个和第二个元素,它的first成员存储键,而second成员存储值。

&:这个符号表示kv是一个引用(reference),而不是值的拷贝,如果不使用引用的话,那在每次循环迭代中都会重新创建一个新的pair对象来复制键值,而这会导致不必要的内存分配和拷贝操作。

代码编写

while(n--)
{//输入key和doorcin>>key>>door;//将key和对应的door放进map中umap[key]=door;
}

设置一个flag,用来标志是否找到匹配的键值对

bool flag=true;

遍历map,判断当前键值对中的值是否等于输入的值,如果等于,则将键输出并退出

for(const pair<int,int>&kv:umap)
{//检查当前键值对中的值是否等于xif(kv.second==x){cout<<kv.first<<endl;//如果找到了匹配的键值对,将kv.first输出到标准输出,并换行flag=false;break;}
}

因此,本题的源代码是:

#include <iostream>
#include <unordered_map>using namespace std;int main()
{int s,n,key,door,x;cin>>s;while(s--){unordered_map<int,int> umap;cin>>n;while(n--){cin>>key>>door;umap[key]=door;}cin>>x;bool flag=true;for(const pair<int,int>&kv:umap){if(kv.second==x){cout<<kv.first<<endl;flag=false;}}if(flag){cout<<"Can't open the door."<<endl;}}
}

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

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

相关文章

vue3 canvas 选择器 Canvas 增加页面性能

文章目录Vue3 选择器 Canvas 增加页面性能基于Vue3 Composition API和Canvas实现的交互式选择器&#xff0c;支持PC端和移动端的拖动选择、多选取消选择功能vue3组件封装html代码Vue3 选择器 Canvas 增加页面性能 基于Vue3 Composition API和Canvas实现的交互式选择器&#xf…

Python 实战:打造多文件批量重命名工具

引言在实际运维、测试、数据分析、开发流程中&#xff0c;我们经常会处理成百上千条命令操作&#xff0c;例如&#xff1a;各种脚本任务&#xff08;启动、备份、重启、日志查看&#xff09;数据处理流程&#xff08;爬取 → 清洗 → 统计 → 可视化&#xff09;配置自动化&…

设计模式笔记_结构型_代理模式

1. 代理模式介绍代理模式是一种结构型设计模式&#xff0c;它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常在客户端和目标对象之间起到中介作用&#xff0c;能够在不改变目标对象的前提下增加额外的功能操作&#xff0c;比如延迟初始化、访问控制、日志记录等…

C语言<数据结构-单链表>(收尾)

上篇博客我将基础的尾插、尾删、头插、头删逐一讲解了&#xff0c;这篇博客将对上篇博客进行收尾&#xff0c;讲一下指定位置操作增删以及查找这几个函数&#xff0c;其实大同小异&#xff1a;一.查找函数&#xff1a;查找函数其实就是一个简单的循环遍历&#xff0c;所以不加以…

十年架构心路:从单机到云原生的分布式系统演进史

十年架构心路&#xff1a;从单机到云原生的分布式系统演进史 这里写目录标题十年架构心路&#xff1a;从单机到云原生的分布式系统演进史一、技术生涯的起点&#xff1a;单体架构的黄金时代1.1 典型技术栈1.2 记忆深刻的故障二、分布式架构转型期2.1 服务化拆分实践2.2 分布式事…

使用docker搭建nginx

安装docker 和 docker compose验证docker版本配置docker目录配置代理&#xff0c;使docker能访问外网能否ping通最后直接拉入镜像即可docker pull nginx

Intel新CPU助攻:微软Copilot+将登陆台式电脑

微软的Copilot PC计划已经推出一年多&#xff0c;但目前仅支持平板电脑和笔记本电脑&#xff0c;以及少数迷你电脑。 随着Intel下一代桌面处理器——代号为“Arrow Lake Refresh”的推出&#xff0c;Copilot PC功能有望扩展到桌面计算机。 要支持Copilot PC的所有功能&#xff…

【Kubernetes】跨节点 Pod 网络不通排查案例

最近在部署一个集群环境的时候&#xff0c;发现集群中一个子节点与其他子节点不通&#xff0c;而 master 节点可与任何子节点互通&#xff0c;通过抓包排查后&#xff0c;发现是 Linux 路由决策导致的。因此&#xff0c;在此记录下来&#xff0c;希望对大家有所帮助。1、环境及…

【算法训练营Day11】二叉树part1

文章目录理论基础二叉树的递归遍历前序遍历中序遍历后序遍历总结二叉树的层序遍历基础层序遍历二叉树的右视图理论基础 二叉树在结构上的两个常用类型&#xff1a; 满二叉树完全二叉树 在功能应用上的比较常用的有&#xff1a; 二叉搜索树&#xff1a; 节点有权值、遵循”左…

Flutter 之 table_calendar 控件

1.库导入在pubspec.yaml文件中dev_dependencies:table_calendar: ^3.2.02. 代码编写TableCalendar(daysOfWeekHeight: 20,availableGestures: AvailableGestures.horizontalSwipe,firstDay: DateTime.now().subtract(const Duration(days: 365)),lastDay: DateTime.now(),cal…

【leetcode】1486. 数组异或操作

数组异或操作题目题解题目 1486. 数组异或操作 给你两个整数&#xff0c;n 和 start 。 数组 nums 定义为&#xff1a;nums[i] start 2*i&#xff08;下标从 0 开始&#xff09;且 n nums.length 。 请返回 nums 中所有元素按位异或&#xff08;XOR&#xff09;后得到的…

php7.4使用 new DateTime;报错 Class DateTime not found

php7.4使用 new DateTime;报错Uncaught Error: Class ‘app\home\c\DateTime’ not found 查了半天资料&#xff0c;最后找到了解决办法 DateTime 是 php 内置的类&#xff0c;不隶属于任何命名空间&#xff0c;如果你需要在命名空间中使用须有 \ 声明&#xff0c;解决办法就是…

Gartner《构建可扩展数据产品建设框架》心得

一、背景与价值 1.1 “数据产品”为什么忽然重要? 传统模式:业务提出需求 → IT 建数据集 → ETL 管道爆炸 → 维护成本指数级上升。 新范式:把“数据”包装成“产品”,以产品思维迭代演进,强调复用、自助、可扩展。 Gartner 观察到:大量组织把“报表”或“数据仓库”重…

CentOS/RHEL LVM 磁盘扩展完整教程

CentOS/RHEL LVM 磁盘扩展完整教程&#x1f4dd; 前言 在Linux系统管理中&#xff0c;磁盘空间不足是经常遇到的问题。特别是在生产环境中&#xff0c;当根分区空间告急时&#xff0c;我们需要通过添加新磁盘来扩展存储空间。本教程将详细介绍如何在CentOS/RHEL系统中使用LVM&a…

LVGL应用和部署(用lua做测试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】嵌入式产品做好了&#xff0c;下面就是测试和量产了。以按键屏幕的开发模式为例&#xff0c;如果仅仅是简单的功能测试&#xff0c;那还比较好解决&…

phpstudy搭建pikachu

一.启动mysql和nginx服务二.修改靶场文件参数点击管理打开根目录&#xff0c;将下载好的靶场源文件解压到www目录下三.找到此文件用记事本打开四.修改配置文件五.打开浏览器,输入127.0.0.1/pikachu六.按照步骤初始化心得体会&#xff1a;如果mysql启动又立刻停止&#xff0c;大…

【Linux】GDB/CGDB 调试器学习笔记

GDB/CGDB 调试器学习笔记&#x1f680; 前言 GDB 是 GNU 项目下功能强大的命令行调试器&#xff0c;适用于 C/C 等多种语言。CGDB 则是在 GDB 之上构建的轻量级 curses 界面&#xff0c;适合喜欢终端操作且习惯 vi 风格的人。一、GDB 入门篇 1. 编译时带调试信息 gcc -g -O0 -W…

链接代理后无法访问网络

路由方向的问题 cmd 输入 route print 查看路由多了一个不是你网络的路由 我的嘎嘎好用直接那都通 route add -p 0.0.0.0 mask 0.0.0.0 0.0.0.0 参考这个 固定ip if是代理链路的 链路口又敏感词这个文章不合规两次评论区问我

day37 早停策略和模型权重的保存

DAY 37 我今天的笔记是用cpu训练的&#xff0c;请自行修改为gpu训练 仍然是循序渐进&#xff0c;先复习之前的代码 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_…

网络爬虫分类全解析

网络爬虫作为数据获取的重要工具,其分类方式多样,不同类型的爬虫在技术实现、应用场景和功能特性上存在显著差异。深入理解这些分类,有助于开发者根据实际需求选择合适的爬虫方案。本文将从技术特性、应用场景和架构设计三个维度,系统介绍网络爬虫的主要分类。 一、按技术…