map的常用用法详解_辉小歌的博客-程序员宝宝_map使用

技术标签: c++  # 算法  map  

map翻译为映射:也是常用的STL容器。众所周知,在定义数组时(如int array[100] )其实是定义了个从 int 型到 int 型的映射,比如array[0]=25 array[4]= 36就分别是将0射到25、将4映射到36.。一个double型数组则是将int 型映射到double型,例db[0]=3.14,db[1]=0.01。但是,无论是什么类型,它总是将int 型映射到其他类型。这似乎表现出一个弊端:当需要以其他类型作为关键字来做映射时,会显得不太方便。 例如有一本字典, 上面提供了很多的字符串和对应的页码,如果要用数组来表示“字符串-页码”这样的对应关系,就会感觉不太好操作。这时,就可以用到map,因为map可以将任何基本类型(包括STL 容器)映射到任何基本类型(包括STL容器),也就可以建立string型到int型的映射。
还可以来看一个情况:这次需要判断给定的一些数字 在某个文件中是否出现过。按照正常的思路,可以开一个bool型hashTable[max size], 通过判断hashTable[x]为true还是false 来确定x是否在文件中出现。但是这会碰到一个问题,如果这些数字很大(例如有几千位),那么这个数组就会开不了。而这时map就可以派上用场,因为可以把这些数字当成一些字符串,然后建立sring至int 的映射(或是直接建立int至int的映射)。

需要的头文件:

#include<map>

需要的其他东西:

using namespace std;

map的定义

单独定义一个map:

map<typename1, typename2> mp;

map和其他STL容器在定义上有点不一样,因为map需要确定映射前类型(键key)和映射后类型(值 value ),所以需要在<>内填写两个类型,其中第一个是键的类型,第二个是值的类型。如果是int型映射到int型,就相当于是普通的int型数组。
如果是字符串到整型的映射,必须使用string而不能用char数组:

map<string , int > mp;

这是因为char数组作为数组,是不能作为键值的。如果想用字符串做映射,必须用string。
map的键和值也可以是STL容器,例如可以将一个set容器映射到一个字符串:

map<set<int>,string> mp;

map容器内元素的访问

map一般有两种方式访问: 通过下标访问或通过迭代器访问。下面分别讨论这两种访问方式。
(1)通过下标访问
和访问普通的数组是一样的,例如对一个定义为map<char , int > mp的 map来说,就可以直接使用mp[ ’ c ’ ] 的方式
来访问它对应的整数。于是,当建立映射时,就可以直接使用mp[ ‘c’ ]=20这样和普通数组一样的方式。
但是要注意的是,map中的键是唯一的,也就是说,下面的代码将输出30:
在这里插入图片描述
(2)通过迭代器访问
map迭代器的定义和其他STL容器迭代器定义的方式相同:

map< typename1 , typename2 >::iterator it;

typename1和typename2就是定义map时填写的类型,这样就得到了迭代器it。
map迭代器的使用方式和其他STL容器的迭代器不同,因为map的每一对映射都有两个typename,
这就决定了必须能通过一个it来同时访问键和值。
事实上,map可以使用it->first来访问键,it->second来访问值。
在这里插入图片描述
在上面这个例子中,it->first是当前映射的键,it->second是当前映射的值。
你从上图可以发现一个特别有意思的现象:map会以键从小到大的顺序自动排序,即按a<m<r的顺序排列这三对映射。
这是由于map内部是使用红黑树实现的(set也是),在建立映射的过程中会自动实现从小到大的排序功能。

map常用的函数

(1)find()
find(key)返回键为key的映射的迭代器,时间复杂度为O(logN),N为map中映射的个数。
在这里插入图片描述
(2)erase()
erase()有两种用法: 删除单个元素,删除一个区间内的所有元素。
①删除单个元素
删除单个元素有两种方法:
mp.erase(it),it为需要删除的元素的迭代器。时间复杂度为O(1)。
在这里插入图片描述
mp.erase(key),key为欲删除的映射的键。时间复杂度为O(logN),N为map内元素的个数。
在这里插入图片描述
②删除一个区间内的所有元素。
mp.erase(first,last) , 其中 first为需要删除的区间的起始迭代器,而last则为需要删除的区间的末尾迭代器的下一个地址,
也即为删除左闭右开的区间[first,last)。时间复杂度为O(last-first)。
在这里插入图片描述
(3)size()
size()用来获得map中映射的对数,时间复杂度为O(1)。
在这里插入图片描述
(4)clear()
clear()用来清空map中的所有元素,复杂度为O(N),其中N为map中元素的个数。
在这里插入图片描述

map的常见用途

  • 需要建立字符(或字符串)与整数之间映射的数目,使用map可以减少代码量。
  • 判断大整数或者其他类型数据是否存在的题目,可以把map当bool数组使用。
  • 字符串和字符串的映射也很有可能会遇到。

延伸:map的键和值是唯一的,而如果一个键需要对应多个值,就只能用multimap。
另外C++11标准中还增加了unordered_map,以散列代替map内部的红黑树实现,
使其可以用来处理只映射而不按key排序的需求,速度要比map要快的多。

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

智能推荐

spring事务管理之声明式事务管理_ysmbdjglww的博客-程序员宝宝

参考前一篇文章spring事务管理之编程式事务管理其dao层没有发生变化,具体逻辑也与之前的是相同的,只是对xml和service文件进行了一些更改。&amp;lt;!--引入外部的属性文件--&amp;gt; &amp;lt;context:property-placeholder location=&quot;classpath:jdbc.properties&quot;/&amp;gt; &amp;lt;bean id=&quot;...

SQL Server 2005常见问题解答_zgqtxwd的博客-程序员宝宝

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

零基础如何入门Java_又是一个特殊的一天的博客-程序员宝宝

首先告诉你的是,作为一个初学者想转行学习Java并不是很容易,Java本身是具有一定难度的,虽然说兴趣这东西可以让我们学习不累,但是有多少人学习是因为兴趣,或者有多少人知道自己的兴趣在哪?所以我很明确的告诉你学习这事本来就是一件非常煎熬的事情,没有多少人愿意学习,但是或许你现在是身为一个应届生或者你是一个本职工作没有发展的,想转行的,所以对于学习任何东西开始,必须逼着自己学,不然可能你学什么都学不进去,我看了其他答主的回答,我个人并不是认为说那些专业术语是对零基础有好处,因为他们根本看不懂,一下是我的白话文

delphi 内存流 操作_weixin_30570101的博客-程序员宝宝

delphi 内存流 操作前言:所谓"流", 就是一段数据或是一块内存;在进行流操作时, 我们不必关心流中的数据到底是什么; 只需要知道流的大小和当前的指针位置. 所以流只有两个属性: Size、Position.对流的操作, 不过就是读取和写入. 所以流最主要的方法就是 Read 和 Write.在很多控件的使用中, 读取主要用 LoadFromStream; 写入主要用 SaveToStr...

subversion linux 服务器端搭建 源码安装_weixin_34082789的博客-程序员宝宝

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

随便推点

IIS7中发布网站到公网技巧与排错_Allen----Liu的博客-程序员宝宝_iis发布到外网

为了最大化发挥硬件的优势,把客户的服务器升级到了Windows Server 2008,面临把SharePoint应用和ASP.NET网站迁移到IIS7中,从新发布到公网。这里就谈谈如何在IIS7发布ASP.NET网站到公网。为了顺利迁移,首先搭建了一个VMware虚拟机进行测试,在虚拟机中安装了Windows Server 2008,SQL Server,IIS7,Server-U,然后

什么是xss?_努力飞翔幸存者的博客-程序员宝宝_什么是xss

xss原理:xss又叫css,全称跨站脚本攻击。它是指攻击者往web页面或url里插入恶意JavaScript脚本代码且应用程序对用户输入的内容没有过滤,那么当正常用户浏览该页面时,嵌入在web页面的恶意JavaScript脚本代码会被执行,从而达到恶意攻击正常用户的目的。漏洞的位置:数据交互与输出的地方。漏洞产生的两个条件:1.用户可以控制的输入点。 2.输入能返回到前端的页面上被浏览器当成脚本语言解析执行。xss漏洞的...

c++之复数类运算_miaomiao328的博客-程序员宝宝_c++复数运算

在写之前本人头脑是懵的,因为完全忘记了复数是什么,原谅我高中数学不好。那么我们大体回顾一下复数,即a+bi,那么关于它的运算法则大体有以下几种。1.加法法则  复数的加法按照以下规定的法则进行:设z1=a+bi,z2=c+di是任意两个复数,则它们的和是 (a+bi)+(c+di)=(a+c)+(b+d)i;返回值类型也应为复数(complex)

监控服务器Zabbix之二 自定义键值及模板_weixin_33814685的博客-程序员宝宝

一、添加主机打开zabbix的web界面http://192.168.212.2/zabbix1、Configuration---Hosts---CreatehostHost name:这个应该是agent配置文件定义的Hostname,我们这是192.168.3.3。Visible name:这个就是显示名称,自定义即可。Group...

近日随想两则_philip_2020的博客-程序员宝宝

一:IDE vs 记事本经常看到一些地方形容一个程序猿很厉害的时候都说:他是用记事本写代码的!大一刚上学的时候,我还没有把一个完整的集成开发环境配置好,再加上一开始写的代码重语法轻逻辑,逻辑都非常简单,所以我甚至连记事本都不用,直接在代码提交窗口里写代码。一直到那个学期的期末考试之前…还沿用的是这种方法。所以debug全靠肉眼,不知道什么是单步前进、什么是跳出,反正都没用过。现在想想,真的是很蠢。之后我用了一年半的Visual Studio 2017,体验不错。期间因为要用Linux虚拟机就配置了Ub

XSS知识总结_Archie_java的博客-程序员宝宝_xss总结

XSS基础跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至

推荐文章

热门文章

相关标签