例说数据结构&STL(九)——map

2023-11-02

1 白话map
  map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map是内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,这和数据结构set一样,只不过map的键与值是不同的类型,而set中每个键值对是同一个值。
  map键与值都可以是随意类型,例如我们想访问学生登分系统,通过定义一个姓名对应分数的map,这样键可以是string类型,而值可以是int类型,所以定义的map可以是map<string,int> score。此外我们还想在登分之前通过学号姓名的map,这样键值对我们就可以分别定义为int,string类型,所以定义的map又可以是map<int,string> name
2 STL中map实战
 2.1 包含map的头文件

#include<map>

using namespace std;

 2.2 map对象声明
  map的构造重载了好几种构造函数,但是都是涉及内存分配器,所以我们就按默认定义即可:

map<int,float> map_fir;

 2.3 插入键值对
  由于map是自动排序的,所以键值对插入什么地方无需关注,我们只要关心放入什么数据就行。map插入键值对有三种方式,如下:

map<int,float> map_sed;

map_sed.insert(pair<int,float>(100 , 0.1234)); //方法一

map_sed.insert(map<int,float>::value_type(110,100.86)); //方法二

map_sed[120] = 10000; // 方法三

  以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的。当然前两种方式是一样的,都是用insert函数插入数据。但是数据的插入涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用operator[]重载的方式就不同了,它可以覆盖以前该关键字对应的值。如下:

map<int,float> map_sed;

map_sed.insert(pair<int,float>(100 , 0.1234)); 
map_sed.insert(pair<int,float>(100 , 0.5555)); //该键值对不会更新,100键对应的还是0.1234值.

map_sed[110] = 50;
map_sed[110] = 10086; //110键对应的值会发生改变,变成10086。

 2.4 查询键值对
  有时候我们希望查询一下当前map中是否存在某一键值,和set一样我们有两种方法,如下:

map<int,float> map_thd;

map_thd.count(110); // 统计map中某一关键字出现的个数,注意是关键字,不是值

  上面程序统计110出现的个数,我们知道map中关键字只可以出现一次,所以返回结果要么是1要么是0。所以通过返回值可以确认map中是否存在该关键字。

map<int,float> map_for;

if(map_for.find(110)!=map_for.end()) // find()方法返回的是查询关键字的迭代器,如果没有查询到则指向end()
    //... 

 2.5 边界元素

map<int,float>::iterator iter1 = map_fir.lower_bound(2); //返回map中>=2的索引(迭代器),切记不是小于2的有意思

map<int,float>::iterator iter2 = map_fir.upper_bound(2); //返回map中>2的索引 

 2.6 查询键值对
  关联式容器也可以通过迭代器间接访问每个元素,迭代器可以象征性的看成是指针。map和其他能够使用迭代器的容器一样,它的迭代器是双向的,我们可以从头到尾(正向迭代),也可以从尾到头(反向迭代)访问每个数据。

#include<iterator> 

map<int,float>::iterator iter; //对应迭代器对象

//正向间接访问
for(iter=map_fir.begin();iter!=map_fir.end();iter++)
    cout<<iter->first<<"="<<iter->second<<endl;  

  反向索引:

map<int,float>::reverse_iterator iter; //对应反向迭代器对象

//反向间接访问
for(iter=map_fir.rbegin();iter!=map_fir.rend();iter++)
    cout<<iter->first<<"="<<iter->second<<endl;  

  上面begin()指向的是map中首元素地址,而end()指的是集合中尾部数据的下一位地址。在反向迭代器操作中,rbegin()指向的是map尾部数据,而rend()指向第一个元素前面一个位置的元素(这个元素被认为是反转后的尾部)。此外,切记上面反转迭代也是iter++,而不是我们想的iter- -,这个过程map内部已经帮忙转换。
 2.7 删除操作

map<int,float>::iterator iter;

iter = map_fir.find(1);
map_fir.erase(iter);  // 迭代器删除某一个键值对

int n = map_fir.erase(1); // 关键字删除,如果删除了会返回1,否则返回0

map_fir.erase(map_fir.begin(),map_fir.end()); // 成片删除

 2.8 其他常用操作

map<int,float> map_fir;

map_fir.swap(map_sed); // 交换所有数据,需要确保map中元素类型相同

map_fir.clear();       // 清空map_fir

map_fir.size();        // 统计map_fir中元素个数

map_fir.empty();       // 判断map中是否为空,如果是空则返回1

3 小结
  上面介绍了map数据结构特点以及STL中包含的接口。由于map和set一样是基于红黑树构建的数据结构,所以其存取,访问等时间复杂度都为O(logn),n为集合中元素的个数。
  以上是个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
  转载请注明出处:http://blog.csdn.net/FX677588/article/details/76375350  


  参考文献:
  http://blog.csdn.net/it_yuan/article/details/22697205

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

例说数据结构&STL(九)——map 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 按成员序列化

    我已经实现了template
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 频数表&频率表

    一 基本概念 1 频数表是将数据集按照某个特定列分类 分组 时观察每个类 组中数据出现次数的表 2 列联表是观测数据按两个或更多属性 定性变量分类时所列出的频数分布表 是由两个以上的变量进行交叉分类的频数分布表 3 频数也称 次数 对样本数
  • 关于this.$refs是undefined

    问题 最近在做开发的时候 遇到这样一个问题 从后端请求到一个图片列表 需要根据返回图片的情况设置元素的宽度 这就需要这样计算list的宽度imgList length imgElement clientWidth 为了在各种移动端自适应 不
  • opencv 解决ippicv下载问题,离线:ippicv_2019_lnx_intel64_general_20180723.tgz

    ippicv 2019 lnx intel64 general 20180723 tgz 这个下载超级慢 有设么用呢 硬件加速 人脸识别 说法不统一啊 以后再完善 下载超时怎么办呢 那我们就采取手动下载的模式然后离线安装 1 下载 ippi
  • UE4像素流

    UE4像素流 局域网 公网 文章目录 UE4像素流 局域网 公网 TOC 文章目录 前言 一 启用像素流 二 项目设置配置像素流参数以及打包 1 配置 打包 配置启动参数 启动像素流服务 信令服务器 http服务 80端口 8888端口 端
  • DDD的分层架构

    DDD作为一种指导思想 还是有一些相对来说可以落地的东西 比如说他这个分层架构 整体分为以下四层 实际上基于上图 我们可以把我们项目工程文件再具体一点 填写到上面的图片上 用户接口层 user interface 用户接口层负责向用户显示信
  • poi生成word文档,包含插入表格

    package com controller import java io FileInputStream import java io FileOutputStream import java io IOException import
  • 「京谈客服系统」出击:京东再起TO B战事

    对于企业而言 基于京谈的技术支持 企业能够获得的不仅仅是客服系统的优化重塑 更多的是把业务直接建立在京东对于客服系统的理解之上 从产业的视角重新定义自身客服体系 作者 皮爷 出品 产业家 数字化浪潮正滚滚而来 8月2日 财富 杂志发布了最新
  • PostgreSQL:“more than one owned sequence found“异常问题解决

    问题 本地数据库正常 但还原部署到服务器数据库后 添加表记录时提示 more than one owned sequence found 的异常报错 解决方案 这个问题是自增列引起的 可能迁移或还原数据表结构时出现异常 解决的办法是重置标识
  • 算法-分治算法

    文章目录 分治算法 什么是分治算法 分治算法的优点 分治算法的核心思想 分治算法的技巧 分治算法的边界 分治算法的常见题型及讲解 归并排序及逆序对问题 归并排序 逆序对问题 快速排序和第k小数 快速排序 第k小数 树的遍历 树的先序遍历 树
  • 高手需要具备的思维模型

    01 思维模型 决定了你的人生状态 电影 教父 中 有一句经典台词 花半秒钟看透本质的人 和花一辈子都看不清的人 注定拥有截然不同的命运 思维模型 决定了你的人生状态 2014年 张一鸣观察到移动互联网时代面临的问题 信息爆炸式增长的同时
  • MATLAB零基础入门(一)

    大家好 我是Henry 上一期的Python爬虫实践中 Henry导入了Matplotlib库进行了新冠疫情的每日新增的绘图 其实Matplotlib的原型是另一门应用非常广泛的语言 Matlab 最近Henry也学习了一些Matlab的绘
  • 【C/C++时间系列】通过gmtime()函数将时间戳转换成GMT时间

    GMT Greenwich Mean Time 格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时 也就是在格林尼治时 的时间 地球每天的自转是有些不规则的 而且正在缓慢减速 所以 格林尼治时间已经不再被作为标准时间使用 现在的标准时间
  • 记一次成功把Vue2后台项目改造成Vite2的踩坑经历

    文章目录 前言 一 项目背景 1 1 为什么要选择Vite 二 迁移前的准备 2 1 补全 vue后缀 2 2 移动public index html的位置 2 2 1 通过vite plugin html插件来修改页面标题 2 3 新建v
  • CCF计算机软件能力认证 C++ 权限查询

    问题描述 授权 authorization 是各类业务系统不可缺少的组成部分 系统用户通过授权机制获得系统中各个模块的操作权限 本题中的授权机制是这样设计的 每位用户具有若干角色 每种角色具有若干权限 例如 用户 david 具有 mana
  • Python Flask简介及安装

    Python Flask简介及安装 Flask 是一个 Python 实现的 Web 开发微框架 一 Flask 简介 Flask 诞生于2010年 是 Armin ronacher 人名 用 Python 语言基于 Werkzeug 工具
  • 嵌入式复习题(五)程序分析题

    1 定时器 假设定时器内部时钟为16MHz 1 完成下面的注释 2 可以定时的时间为 5 ms htim3 Instance TIM3 htim3 Init Prescaler 799 预分频系数为799 htim3 Init Counte
  • 【Network】计算机网络基础知识总结

    阅读目录 网络层次划分 OSI七层网络模型 IP地址 子网掩码及网络划分 ARP RARP协议 路由选择协议 TCP IP协议 UDP协议 DNS协议 NAT协议 DHCP协议 HTTP协议 一个举例 网络层次划分 为了使不同计算机厂家生产
  • 神经网络学说的主要观点,对神经网络的简单理解

    心理学中定位说和模块说的区别是 整体说和神经网络学说的区别是 模块说和神经网络学说的区别是 简单说下 希望对你有帮助 定位说认为 大脑的具体功能是对应具体的部位 模块说认为 大脑的具体功能是由多个部位形成的模块共同实现的 而不是具体到位置
  • 论文理解:Generating Diverse High-Fidelity Images with VQ-VAE-2

    深度生成模型都有什么问题 研究者将常见的生成模型分为两种 一种是基于似然的模型 包括 VAE 及其变体 基于流的模型 以及自回归 autoregressive 模型 另一种是隐式生成模型 如生成对抗网络 GAN 这些模型都会存在某些方面的缺
  • 例说数据结构&STL(九)——map

    1 白话map map是STL的一个关联容器 它提供一对一 其中第一个可以称为关键字 每个关键字只能在map中出现一次 第二个可能称为该关键字的值 的数据处理能力 由于这个特性 它完成有可能在我们处理一对一数据的时候 在编程上提供快速通道