map常用用法详解

技术标签: 知识回顾  STL  

map翻译为映射,也是常见的STL容器

在定义数组时(如int array[100]),其实是定义了一个从int型到int型的映射

比如array[0]=25、array[4]=36就分别是将0映射到25、将4映射到36

一个double型数组则是将int型映射到double型,

如db[0]=3.14,double[1]=0.01

但是,无论是什么类型

它总是将int型映射到其他类型

这似乎表现出一个弊端:

当需要以其他类型为关键字来做映射时,

会显得不太方便

例如有一本字典,

上面提供了很多的字符串和对应的页码,如果要用数组来表示“字符串——>页码”这样的对应关系

就会感觉不太好操作

这时,就可以用到map,因为map可以将任何基本类型

(包括STL容器)映射到任何基本类型(包括STL容器)

也就可以建立string型到int型的映射

【另一种情况】

需要判断给定的一些数字在某个文件中是否出现过

按照正常的思路,可以开一个bool 型hashTable[max_size]

通过判断hashTable[x]为true还是false来确定x是否在文件中出现

但是这会碰到一种问题:

如果这些数字很大(例如有几千位)那么这个数字就会开不了

而这时map就可以派上用场

因为可以把这些数字当成一些字符串

然后建立至int的映射(或者直接建立int至int的映射)

【头文件】

#include<map>

using namespace std;

1、map的定义

map<typename1,typename2>mp;

与其他STL容器在定义上不一样,因为map需要确定映射前类型(键key)和映射后类型(值value)

所以需要在<>内填写两个类型

其中一个是键的类型

第二个是值得类型

如果是int型映射到int型,就相当于是普通的int型数组

但是如果是字符串到整型的映射,必须是string而不是char数组

map<string,int>mp

这时因为char数组作为数组是不能被作为键值的。所以字符串作映射,只能用string

而map的剑河之也可以是STL容器

map<set<int>,string>mp

2、map容器内元素的访问

①通过下标访问

【注意】map的键是唯一的

mp['c']=20;

②通过迭代器访问

定义方式与其他STL容器迭代器相同

【不同】

map迭代器的使用方式和其他STL容器的迭代器不同

因为map的每一对映射都有两个typename

这决定了必须通过一个it来同时访问键和值

事实上,map可以使用it->first来访问键

使用it->second来访问值

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
using namespace std;
int main()
{
   map<char,int>mp;
   mp['m']=20;
   mp['r']=30;
   mp['a']=40;
   for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
   {
       printf("%c %d\n",it->first,it->second);
   }
   return 0;
}

map会以键的大小从小到大的顺序自动排序

即按照a<m<r的顺序排列这三对映射

这是因为map内部是使用红黑树(set也是)

在建立映射的过程中会自动实现从小到大的排序功能

3、map常用函数

①find()

find(key)返回键是key的映射的迭代器

②erase()

(1)删除单个元素

a.mp.erase(it),it为需要删除的元素的迭代器

b.mp.erase(key),key为欲删除的映射的键

e.g.mp.erase('c');

(2)删除一个区间内的所有元素

还是左闭右开

(3)size()

用来获得map中映射的次数

(4)clear()

清空

4、常见用途

①需要建立字符(或字符串)与整数之间影射的题目,使用map可以减少代码量

②判断大整数或者其他类型数据是否存在的题目,可以把map当bool数组使用

③字符串和字符串的映射也有可能会遇到

延伸:

map的键和值是唯一的,而如果一个键需要对应多个值

就只能用multimap

知识点来自于《算法笔记》

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42232118/article/details/82024301

智能推荐

蓝桥杯-夺冠概率 C++实现_CugWahaha的博客-程序员宝宝

// getChampion.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include#include#includeusing namespace std;int _tmain(int argc, _TCHAR* argv[]){double p[4][4]={{0,0.1,0.3,0.5},

自动化编辑器零代码手机RPA脚本开发系列教程一_ti412的博客-程序员宝宝_手机写脚本

最近发现一款手机工具,零代码开发脚本,熟悉了几天发现功能真的挺强大,目前没发现有太多教程,准备做一套入门教程 工具下载地址www.autoeditor.cn首先 打开app,创建项目及任务直接点击任务名称进入编辑界面,上面的授权界面不用管,点任务名称会自动请求权限截图裁剪需要点击的位置比如我们需要点击主题按钮,所以裁剪一下主题图片选择界面 定义名称这里有条件和点击两个开关条件代表找图,就是要在屏幕中找到裁剪后的图片点击就是点击这个图片,点击图片的前提就是找到这个图片开始执行

Python安装成功,pip指令查找不到问题解决_豆浆沾油条的博客-程序员宝宝_pip指令安装

问题描述:因为MAC本自带2.7,版本较低,下载了python3.8。pyhton下载并设置环境变量成功,但是发现使用pip指令失败。问题原因:首先我的环境变量配置是这样的:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXiNeFeB-1619101676218)(upload://sx6C54G9uSEh3rxgHqUJEwVvX4o.png)]那么来到配置的环境变量目录下看看,根本不存在pip指令,当然会失败,只存在pip3和pip3.8[外链图片转存.

数据库应用——MyCat代理MySQL集群_0611-_-的博客-程序员宝宝_mycat 代理mysql

Mycat代理服务器一、Mycat代理服务器1.1 Mycat概述1.2 Mycat功能1.3 Mycat产品一、Mycat代理服务器1.1 Mycat概述从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQ

win10上py37安装kivy_xutengfei999的博客-程序员宝宝_kivy安装

Kivy是开源python函数库,用于开发行动应用程序和其他采用自然用户界面的多点触控应用软件。它可以在Android、IOS、Linux、OS X和Windows执行。kivy是自由且开源的软件。kivy的主要架构有kivy组织开发,并有python用于Android、Kivy IOS和其他许多函式库被使用在所有平台。官网Welcome to Kivy — Kivy 2.1.0 documentation1.安装最新版本的pip和wheelpython -m pip i...

求16个数中的最大值,最小值,和_月光下的渣的博客-程序员宝宝

#include &lt;stdio.h&gt;int main(int argc,char *argv){int a [4] [4],i,j;int sum=0;int max=a[0][0];int min=a[0][0];for(i=0;i&lt;4;i++){for(j=0;j&lt;4;j++){scanf("%d",&amp;a [i] [j]); //从键盘获取16个数}}//显示获取的数for(i=0;i&lt;4;i++){for(j=0;j&lt;4;j

随便推点

【思维题】【贪心】AGC018C —— Coins_ShawnBox的博客-程序员宝宝

题目传送门尝试了一下弱化条件想题的方法,还不错?题目中有三种硬币,并不利于直接贪心.我们不妨先考虑只有两种硬币的情况.按照贪心的思想,应该按照两种硬币的差值(即一个人金币的个数减去银币的个数)进行排序,然后从前选Y个,剩下的X个都为金币.然后我们将条件加回来,发现性质有了一点点变化.因为有铜币的影响,所以并不能直接选取Y个这样做.但是我们还是可以发现,从前开始选银币,和从后开始选金币的区间是...

JDBC往MySql数据库中写汉字出现乱码的问题_Lu'Blog的博客-程序员宝宝

一 情况描述:我的情况是这样,首先我的项目的编码格式是UTF-8,客户端请求时的编码也是UTF-8,在项目配置文件的数据库路径也设置了UTF-8格式编码,如下:spring.datasource.url=jdbc:mysql://192.168.11.139/samp_db?useUnicode=true&amp;AutoReconnect=true&amp;characterEncodi

get方法改成post_theone19的博客-程序员宝宝_get转post

1、请求的方法中get方法改成post文档中请求的方法是get(1)get的请求是正常的(2)把get的请求方法改成post,系统会报错(3)不应该提示繁忙,应该提示 “请求的方法是get”,或者返回404(4)应该提示请求的方法不对(5)get请求方法中,body放请求参数,会报错,不应该报这样的错误...

在spring中指定时间执行程序_黑石川的博客-程序员宝宝

1. 配置spring文件 读bean中加入task任务 xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=""中加入http://www.springframework.org/schema/task http://www.springframework.org/s...

VA_ARG宏的实现_南博恒一的博客-程序员宝宝_va_arg实现

_ARG宏VA_ARG宏_ARG宏的实现 #define va_arg(ap,t)    (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )这个宏做了两个事情,①用用户输入的类型名对参数地址进行强制类型转换,得到用户所需要的值     ②计算出本参数的实际大小,将指针调到本参数的结尾,也就是下一个参数的首地址,以便后续处理。

第一章 认清机运的本质_jingdian14的博客-程序员宝宝

凡是在职场混过几年的年轻人,差不多都相信人生的成败全靠机运,即使那些不十分相信的人,也会常把“时运不济”这类的话挂在口头上。甚至于那些混得蛮有成就的人,也常会谦虚地说:我的运气好!如此一来,“机运”成了人们的口头禅,是很多年轻员工们都误认为“机运”才是决定一生成败的主宰。由于这种心理的影响,再加上经常发生的一些无法理解的事故,使这些相信机运的年轻人越发相信冥冥中真有一股主宰命运的力量,在巧

推荐文章

热门文章

相关标签