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的常用用法(超详细)(*^ー^)人(^ー^*) 的相关文章

  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • 基于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的定义