STL--map的应用

2023-11-16

STL之map的应用

map定义及用途

map翻译为映射,是STL中的常用容器。
其实,数组就是一种映射,比如:int a[100];就是定义了一个int到int的映射。而a[5]=25;就是把5映射到25。数组总是将int类型映射到其它基本类型(称为数组的基类型),
这同时也带来了一个问题,有时候我们希望把string映射成一个int,数组就不方便了。这时就可以使用map,map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)。
map 的用途至少有以下三种情形:

  1. 需要建立字符(串)与整数之间的映射,使用 map 可以减少代码量。
  2. 判断大整数(比如几千位)或者其他类型数据是否存在,可以把map当布尔型数组使用(哈希表)。
  3. 字符串与字符串之间的映射

在这里插入图片描述

map的使用

1、map的定义:
要使用map,必须先添加map头文件,即#include <map>,同时必须要有“using namespace std”。
定义一个map的方法为:

map<typename1,typename2> name;

其中,typename1是映射前的类型(键key),typename2是映射后的类型(值value),name为映射的名字。
1、普通int数组a就是map<int,int> a。
2、map的键和值也可以是STL容器,比如:map<set,string> mp。
3、map的键和值都是唯一的。

2、map的遍历

访问 map 的元素有两种方式,一种是通过下标访问;另一种是通过迭代器访问。
通过下标访问就像普通的数组元素访问,例如先定义map<char,int> mp,然后就可以通过mp[‘c’]的方式来访问它对应的元素,如mp[‘c’]=124。
通过迭代器访问,先作如下定义:

map<typename1,typename2>::iterator it;

因为map的每一对映射都有两个typename,所以,我们使用“it->first”来访问键,而使用“it->second”来访问值。
3、map插入

my_Map["a"]=1; // 最常用的方法
my_Map.insert(map<string,int>::value_type("b",2)); my_Map.insert(pair<string,int>("c",3)); my_Map.insert(make_pair<string,int>("d",4));

4、 map 的常用函数

(1)find()和 size()
find(key)是返回键为 key 的映射的迭代器,时间复杂度为 0(log2 n),n 为 map 中映射的对数。size()用来获得map中映射的对数,时间复杂度为O(1)。

(2)clear()
clear()用来清空 map,时间复杂度为 0(n)。
(3)erase()
erase()可以删除单个元素,也可以删除一个区间内的所有元素。
删除单个元素可以用:erase(it),it为要删除的元素的迭代器,时间复杂度为O(1)。
也可以用:erase(key),key为要删除的映射的键,时间复杂度为O(log2n)。
删除一个区间内的所有元素用:erase(first,last),first为区间的起始迭代器,last为区间的末尾迭代器的下一个地址,也就是左闭右开的区间[first,last),时间复杂度为O(last-first)。

pair 的定义和使用

pair 是“二元结构体”的替代品,将两个元素捆绑在一起,节省编码时间。相当于以下定义:

struct pair{
	typename1 first;
	typename2 second;
}

要使用pair,必须先添加头文件,即#include <utility>,同时,必须要有“using namespace std”。因为map的内部实现中涉及pair,因此添加map头文件时会自动添加utility头文件,此时可以省去utility头文件。
pair有两个参数,分别对应first和second的数据类型,可以是任意基本数据类型或者容器。
定义一个pair的方法为

pair<typename1,typename2> name;

map 和 pair 的应用举例

插入元素

// 定义一个map对象
map<int, string> mapStudent;
 
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
 
// 第二种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";

以上二种用法,虽然都可以实现数据的插入,但是它们是有区别的,用insert函数插入数据,在数据的 插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是不能在插入数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对 应的值,用程序说明如下:

mapStudent.insert(map<int, string>::value_type (001, "student_one"));
 
mapStudent.insert(map<int, string>::value_type (001, "student_two"));

上面这两条语句执行后,map中001这个关键字对应的值是“student_one”,第二条语句并没有生效,那么这就涉及到我们怎么知道insert语句是否插入成功的问题了,可以用pair来获得是否插入成功,程序如下

// 构造定义,返回一个pair对象
pair<iterator,bool> insert (const value_type& val);
 
pair<map<int, string>::iterator, bool> Insert_Pair;
 
Insert_Pair = mapStudent.insert(map<int, string>::value_type (001, "student_one"));
 
if(!Insert_Pair.second)
    cout << ""Error insert new element" << endl;

查找元素

// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapStudent.find("123");
 
if(iter != mapStudent.end())
       cout<<"Find, the value is"<<iter->second<<endl;
else
   cout<<"Do not Find"<<endl;

删除与清空map

//迭代器刪除
iter = mapStudent.find("123");
mapStudent.erase(iter);
 
//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0
 
//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()

map的大小

int nSize = mapStudent.size();

例题:最近的一对
[解题思路]
遍历数组的过程中,利用map 维护每个数字上一次出现的位置,这样可以快速计算每一个a j 所对应的ai 。过程中记录最近的一对出现的位置。

#include <bits/stdc++.h>
 using namespace std;
 int a[100005];
 int main() {
 map<int, int> pos;
 int n, min = 100005, minIndex = -1;

 cin >> n;
 for(int i = 0; i < n; i++)
 {
 cin >> a[i];

 if(pos.find(a[i]) != pos.end())
 {

 int pre = pos[a[i]];
 if(i - pre < min) {
 min = i - pre;
 minIndex = pre;
 }
 }
 pos[a[i]] = i;
 }
 if(minIndex == -1)
 cout << "No" << endl;
 else
 cout << a[minIndex] << endl;
 return 0;
}

练习题

1、求众数
2、A-B 数对
3、查字典

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

STL--map的应用 的相关文章

  • C/C++项目:谁都爱玩的4399小游戏黄金矿工教程

    黄金矿工中文版 是一款休闲益智小游戏 游戏中你需要看准时机出钩子勾取金子或者砖石来获得金钱的累加 达到一定的金钱数才能够闯关成功 游戏十分经典 强烈推荐大家学会编写这款游戏 休闲时没网也能自己玩哦 黄金矿工道具说明 金块 按大小区分 越大越
  • Robot Framework 企业级自动化测试实战

    一 Robot Framework 变量使用 1 变量简介 变量是Robot Framework的一个不可或缺的特性 它们可以在测试数据的大多数地方使用 最常见的是 它们用于测试用例表和关键字表中关键字的参数 但所有设置都允许在其值中使用变
  • pthread信号

    信号是典型的异步事件 内核在某个信号出现时有三种处理方式 忽略信号 除了SIGKILL和SIGSTOP信号不能忽略外 其他大部分信号都可以被忽略 捕捉信号 也就是在信号发生时调用一个用户函数 注意不能捕捉SIGKILL和SIGSTOP 执行

随机推荐

  • 【生成模型新方向】score-based generative models

    这里写目录标题 0 前言 1 介绍 2 The score function score based models and score matching 3 Langevin dynamics朗之万动力学 4 朴素的 Naive score
  • blockly for android app 安装闪退

    java lang RuntimeException Unable to start activity ComponentInfo app robo com roboapp app robo com roboapp MainActivity
  • 上海链节科技:企业链改的价值是什么?

    企业链改并不是盲目的 它应该至少满足两个条件 第一 区块链技术是否与该行业真的契合 是否能工利用区块链和互联网的技术 完成自身系统的改造 提高自身的公信力 提供一系列对于企业当前出现的实际问题的必要回答 这样的依托于区块链改造的 基于特定公
  • 使用R语言中的epiDisplay包进行数据分析和可视化是一种常见的方法

    使用R语言中的epiDisplay包进行数据分析和可视化是一种常见的方法 epiDisplay包提供了丰富的函数和工具 用于描述性统计分析和制作各种图形 其中的summ函数可以帮助我们计算数据框中指定变量在不同分组变量下的描述性统计汇总信息
  • java自定义枚举数组转String类型转换器

    代码如下 public class LotteryActivityTypeConverter implements AttributeConverter
  • Windows中杀死占用某个端口的进程

    最近写项目 总是出现端口被占用的问题 原来傻傻的把电脑重启一下 终于有一天受不了了 想要想办法解决 刚开始从网上找了好多教程 发现不行 开始自己尝试 终于 成功的将占用端口的进程杀掉 在此记录下过程 以8080端口为例 第一步 打开cmd命
  • NLP--BPE、WordPiece、ULM、SentencePiece子词分词器总结【原理】

    序言 当我们在做英语文本任务时 机器无法理解文本 当我们将句子序列送入模型时 模型仅仅能看到一串字节 它无法知道一个词从哪里开始 到哪里结束 所以也不知道一个词是怎么组成的 所以 为了帮助机器理解文本 我们需要 将文本分成一个个小片段 然后
  • leetcode目录

    最近写的题目还没有填到本目录中 可以在去文章列表查看 本目录正在持续更新中 题目 考点 时间 分值 最大利润 贪心算法 2023 Q1 100 施肥问题 逻辑推理 2023 Q1 100 组装数组 深度优先搜索 2023 Q1 200 开租
  • android Button背景高度被拉伸问题--解决方案

    接入第三方SDK后 发现SDK提供的弹窗里 有两个按钮的高度呈被拉伸状态 而 第三方提供的demo内 这两个按钮均呈正常状态 对于第一次接触Android的菜鸟来说 这个问题颇为难解 第三方在尝试了几种方法之后 也宣告失败 这种奇葩问题 让
  • element项目中遇到的小问题总结

    在用element UI框架做项目时遇到的问题 现在总结记录下来 此文档持续更新中 1 日期选择器el date picker赋值后再次修改时页面不回显
  • JS逆向进阶案例

    前情回顾 有道翻译参数破解 百度翻译参数破解 之前 我们介绍了两种基础的JS逆向案例 今天 就继续来分享一个稍微复杂的JS逆向案例吧 目录 一 寻找加密源码 二 查漏补全JS代码 三 全部代码 爬取网址 某网站 本次爬取仅供学习 无任何商业
  • Mac上安装双系统

    写在前面 Mac用户在使用过程中 多少有的时候还会使用Windows 想装一个咋办 找某宝需要花钱150元 看这篇文章 十几分钟看明白 自己动手丰衣足食 所以本文将以图文教程教你如何安装双系统 开机随意选择 想用什么用什么 尽管我不是很喜欢
  • FFmpeg 采用源码安装 、环境配置、卸载

    https blog csdn net qq 36397240 article details 107745149 FFmpeg 采用源码安装 环境配置 卸载 验证了几种ffmpeg x264安装方法 这篇文章清晰简洁 特别是对环境配置介绍
  • AES(加密,填充,模式)新手小结

    本小结的密码学术语如填充 模式 等等 均以AES为例进行说明 举一反三 其他算法涉及的相同术语 大致也就理解是怎么回事了 吧 1 AES https nvlpubs nist gov nistpubs FIPS NIST FIPS 197
  • 【电子电路】五款单按键开关机电路图

    一 单按键开关机电路图 本例电路可实现通过按一次按键S1实现开机 再按一次S1实现关机的功能 整个电路的工作过程 电路中连接器P1是一个电源连接器 电源 从1 2脚输入 电源地从3 4脚输入 电路上电后 P MOS管Q1的G极和S极都是为高
  • Matatalab:编程只是大人的专利?这款儿童实物编程机器人了解一下

    转自 http www sohu com a 294483601 485557 创始人 https www tianyancha com brand b5813253827 CEO 苏荣星 MatataLab CEO 曾任职 mBot Ra
  • 基于入侵杂草算法的函数寻优算法

    文章目录 一 理论基础 1 算法简介 2 杂草特性 二 案例背景 1 问题描述 2 解题思路及步骤 1 初始化种群 2 繁殖 3 空间分布 4 竞争性排斥规则 3 算法流程 三 MATLAB程序实现 1 清空环境变量 2 问题设定 3 参数
  • 用matlab计算超调,怎样用matlab计算超调量、峰值时间

    2018 01 19 Intel Xeon E5 2697 v2的CPU的峰值计算能力和Intel Xeon E7 8870的CPU的峰值计算能力哪个强 必然Xeon E5 2697 v2运算能力强 首先 看核心数 Xeon E5 2697
  • 动态环境下基于强化学习的无人机任务路径规划

    路径规划主要是指无人机环境中存在威胁障碍物 然后 规划无人机从起点到目的地避开障碍物的最佳路线也是无人机实现自主飞行的主要因素之一 在无人机的任务分配中 主要目的是增强无人机的时间性能和环境适应性 对于无人机的路径规划水平 修改和改进算法可
  • STL--map的应用

    STL之map的应用 map定义及用途 map翻译为映射 是STL中的常用容器 其实 数组就是一种映射 比如 int a 100 就是定义了一个int到int的映射 而a 5 25 就是把5映射到25 数组总是将int类型映射到其它基本类型