C++ map的常用用法(超详细)(*^ー^)人(^ー^*)

2023-10-28

C++中的map翻译为映射,不是地图!!! 也是常用的STL容器。它在算法竞赛中应用十分广泛,因为map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器),十分灵活。因此我们很有必要来熟练map的常用用法。

目录

1、map的定义

2、map容器内元素的访问

3、map常用函数实例解析:

1、find():

2、erase():

3、size():

4、clear():

4、拓展


1、map的定义

单独定义一个map:

map<typename1, typename2> mp;

其中,typename1是的类型,typename2是的类型。

注:如果是字符串到整型的映射,必须使用string而不能用char数组!

map<string, int> mp;

这是因为char数组作为数组,是不能被作为键值的。所以如果想用字符串做映射,必须用string

再举个栗子例子:map的键和值也可以是STL容器,例如以下代码将一个set容器映射到一个字符串:

map<set<int>, string> mp;

2、map容器内元素的访问

一般有两种访问方式:通过下标访问或通过迭代器访问:

1、通过下标访问:

和普通数组一样,例如一个定义为map<char, int> mpmap来说,可以直接使用mp['c']的方式来访问它对应的int整数。可以直接使用mp['c'] = 20这样的方式来赋值:

map<char, int> mp; 
mp['c'] = 20;
cout << mp['c'];	//答案输出20

但是要注意的是,map中的键是唯一的,例如以下代码:

map<char, int> mp; 
mp['c'] = 20;
mp['c'] = 30;	//30覆盖了20 
mp['c'] = 666; 	//666覆盖了30 
cout << mp['c'];	//答案输出666 

2、通过迭代器访问:

map迭代器的定义和其他STL容器迭代器定义的方式相同:

map<typename1, typename2>::iterator it;

这样就得到了迭代器 it

map可以使用it->first来访问it->second来访问

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		cout << it->first;	 
		cout << " "; 
		cout << it->second;
		cout << endl;
	} 	
	return 0;
}

代码输出结果:

a 222
b 333
c 444

还有一点要补充,就是map会以从小到大的顺序自动排序,如:

mp['c'] = 222;
mp['a'] = 333;	
mp['b'] = 444;

顺序输出结果是(即按a < b < c的顺序从小到大排序):

a 333
b 444
c 222

上述现象是因为,map内部是由实现的(set也是),在建立映射的过程中,会自动实现从小到大排序功能。

3、map常用函数实例解析:

1、find():

find(key)返回键为key映射的迭代器,时间复杂度为O(logN),N为map中映射的个数:

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	map<char, int>::iterator it = mp.find('b');
	cout << it->first << " " << it->second;
	return 0;
}

输出结果:

b 333

2、erase():

erase()有两种用法:1、删除单个元素。2、删除一个区间内所有的元素

① 删除单个元素:

mp.erase(it)it为需要删除的元素的迭代器。时间复杂度为O(1):

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	map<char, int>::iterator it = mp.find('b');
	mp.erase(it);
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		cout << it->first << " " << it->second << endl;
	}
	return 0;
}

输出结果:

a 222
c 444

mp.erase(key)key为要删除的映射的键。时间复杂度O(logN),N为map内元素的个数:

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	//map<char, int>::iterator it = mp.find('b');
	//mp.erase(it);
	mp.erase('b');
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		cout << it->first << " " << it->second << endl;
	}
	return 0;
}

输出结果:

a 222
c 444

② 删除一个区间内所有的元素:

mp.erase(first, last),其中,first为需要删除的区间的起始迭代器last为需要删除的区间末尾迭代器的下一个地址,即为删除左闭右开的区间[first, last)。时间复杂度为O(last - first):

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	map<char, int>::iterator it = mp.find('b');
	mp.erase(it, mp.end()); //删除it之后的所有映射,即b 333和 c 444 
	//mp.erase(it);
	//mp.erase('b');
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		cout << it->first << " " << it->second << endl;
	}
	return 0;
}

输出结果:

a 222

3、size():

size()用来获得map中映射的对数,复杂度为O(1)。

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	cout << mp.size(); 
	return 0;
}

输出结果:

3

4、clear():

clear()用来清空map中的所有元素,复杂度为O(N),N为map中元素个数:

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	mp.clear();	//清空map
	cout << mp.size(); 
	return 0;
}

输出结果:

0

4、拓展

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ map的常用用法(超详细)(*^ー^)人(^ー^*) 的相关文章

随机推荐

  • 基于java的https双向认证,android上亦可用

    https my oschina net jjface blog 339144 摘要 概述 客户端 浏览器或者使用http协议和服务器通信的程序 如 客户端通过浏览器访问某一网站时 如果该网站为HTTPS网站 浏览器会自动检测系统中是否存在
  • 跟着React官网学习(一):小游戏

    目标简述 简单了解React Props传值 组件之间的交互 开发者工具 使用vscode开发 搭建环境创建项目 1 安装node js和npm 2 使用create react app创建项目并运行 1 在dos命令窗口 指定文件目录 输
  • 【UI自动化】selenium中三种等待方式

    Selenium 等待方式 Selenium 等待方式 示例 time sleep seconds 固定等待 智能隐性的等待implicitly wait 回应超时等待 智能显性等待WebDriverWait expected condit
  • JPA之JPA中的联合主键

    如果要搭建JPA开发环境 请从JPA第一篇博客看起 下面以坐飞机为例 讲解联合主键的使用 基本思想是一条航线由两个端点组成 1 组合主键类 package compositepk import java io Serializable im
  • Python共生矩阵对比奇异值分解 (SVD)和词嵌入

    词嵌入 词嵌入是转换成数字的文本 同一文本可能有不同的数字表示 许多机器学习算法和几乎所有深度学习架构都无法处理原始形式的字符串或纯文本 它们需要数字作为输入来执行任何类型的工作 从广义上讲是分类 回归等 不同类型的词嵌入可以大致分为两类
  • ubuntu下Android Studio安装教程

    1 首先是jdk和Androidstudio的安装包 http www oracle com technetwork java javase downloads jdk8 downloads 2133151 html下载JDK jdk安装步
  • jenkins部署vue项目详细步骤

    第一步 创建项目 新建Item 输入名字 选择项目类型 第二步 配置基本信息 输入对项目的简单描述 第三步 选择源码管理 我这里用的是码云 注 如果Credentials部分没有连接git的账号密码 需要去配置 第四步 配置构建触发器 我这
  • 基于RFID定位技术的室内定位原理--RFID室内定位--新导智能

    通讯网络的蜂窝定位技能除外 常见的室内无线定位技能还有 Wi Fi 蓝牙 红外线 超宽带 RFID ZigBee和超声波等 但是在这里我们就不一一列举了 我们只探讨应用最为广泛的RFID室内定位 RFID定位原理 射频辨认 RFID 技能是
  • JavaScript入门基础(二)

    目录 1 JavaScript概述 2 HTML世界 3 JavaScript基本语法 4 JavaScript语句 5 JavaScript内置对象 6 Document对象 7 window和frame 8 表单对象 9 了解其他常用对
  • K8S报错error validating data: ValidationError(Deployment.spec): missing required field selector

    报错如下 这是我在执行 deployment控制器的Pod副本时出现的报错 报错意思 部署验证错误 在deploymentspec模块中必须指定 selector参数 原YAML文件 在 Deployment spec 模块中 只指定了 r
  • 什么是主数据管理?企业主数据管理方法论

    什么是主数据管理 主数据又被称为黄金数据 其价值高也非常重要 对企业来说 主数据的重要性如何强调都不为过 主数据治理是企业数据治理中最为重要的一环 主数据管理的内容包括 主数据管理标准 主数据应用标准 和 主数据集成服务标准 三大类 主数据
  • easyAR使用

    1 helloAR试运行 参考视频 https www bilibili com video av6497575 from search seid 266540759772649759 1 easyAR官网下载SDK for unity3D
  • 词句相似度计算——余弦相似度

    余弦相似度 是一种通过判断两个向量的夹角来判断其相似性的数学方法 举个栗子 A 中国工商银行北京分部北京支行 B 中国招商银行广西分部桂林支行 我们用 余弦相似度 的办法来判断这两个句子的相似性 1 分词 第一步要做的肯定是分词 把一个句子
  • 解决fiddler抓不到浏览器包的问题

    这里写自定义目录标题 解决fiddler抓不到浏览器包的问题 安装fiddler 简单介绍fiddler的工作原理 解决fiddler抓不到包的方法 解决fiddler抓不到浏览器包的问题 不管是对于开发还是测试同学 fiddler抓包都是
  • 1 CentOS7通过定时脚本阻断异常IP连接SSH(实测)

    需求 由于业务需要将Linux服务器映射到公网访问 SSH 端口已经修改 但还是发现有很多IP进行暴力破解 尝试将异常IP阻止非法访问 实现方式 SSH黑名单 Firewalld防火墙添加drop规则 原理 通过定时脚本检查系统登录失败日志
  • 黑白滤镜 ie专用

    最近网站要求黑白的频率变多了 html filter progid DXImageTransform Microsoft BasicImage grayscale 1
  • Python 读取文件首行多了"\ufeff"字符串

    问题背景 python读取B txt文件时 控制台打印首行正常 但是若是用首行内容打开文本的话 就会报错 Traceback most recent call last A File E python project multiProces
  • html表格里面怎么合并单元格的快捷键,合并单元格快捷键ctrl加什么?

    01 先选择要合并的单元格 按CTRL 1键 再用 及 方向键移动到第二个选项卡 再按ALT M键 再按确定 完成 Excel是Microsoft为使用Windows和AppleMacintosh操作系统的电脑编写的一款电子表格软件 Wor
  • Kali-linux安装之后的简单设置

    1 更新软件源 修改sources list文件 leafpad etc apt sources list 然后选择添加以下适合自己较快的源 可自由选择 不一定要全部 官方源 deb http http kali org kali kali
  • C++ map的常用用法(超详细)(*^ー^)人(^ー^*)

    C 中的map翻译为映射 不是地图 也是常用的STL容器 它在算法竞赛中应用十分广泛 因为map可以将任何基本类型 包括STL容器 映射到任何基本类型 包括STL容器 十分灵活 因此我们很有必要来熟练map的常用用法 目录 1 map的定义