C++回顾(二十五)—— map/multimap容器
25.1 map/multimap的简介
- map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对。它提供基于key的快速检索能力。
- map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
- map的具体实现采用红黑树变体的平衡二叉树的数据结构。在插入操作和删除操作上比vector快。
- map可以直接存取key所对应的value,支持[]操作符,如map[key]=value。
- multimap与map的区别:map支持唯一键值,每个键只能出现一次;而multimap中相同键可以出现多次。multimap不支持[]操作符。
- 需要添加头文件:`#include
25.2 map/multimap构造
- map/multimap采用模板类实现,对象的默认构造形式:
map<T1,T2> mapTT;
multimap<T1,T2> multimapTT;
如:
map<int, char> mapA;
map<string,float> mapB;
//其中T1,T2还可以用各种指针类型或自定义类型
map(const map &mp); //拷贝构造函数
25.3 map的使用
(1)map的插入与迭代器
map.insert(…); //往容器插入元素,返回pair<iterator,bool>
在map中插入元素的三种方式:
假设 map<int, string> mapStu;
-
一、通过pair的方式插入对象:
mapStu.insert( pair<int,string>(3,"小张") ); -
二、通过make_pair的方式插入对象:
mapStu.inset(make_pair(-1, “校长-1”)); -
三、通过value_type的方式插入对象:
mapStu.insert( map<int,string>::value_type(1,"小李") ); -
四、通过数组的方式插入值:
mapStu[3] = “小刘"; mapStu[5] = “小王"; -
前三种方法,采用的是insert()方法,该方法返回值为pair<iterator,bool>
-
第四种方法非常直观,但存在一个性能的问题。插入3时,先在mapStu中查找主键为3的项,若没发现,则将一个键为3,值为初始化值的对组插入到mapStu中,然后再将值修改成“小刘”。若发现已存在3这个键,则修改这个键对应的value。


(2)map对象的拷贝构造与赋值
map& operator=(const map &mp);//重载等号操作符map.swap(mp);//交换两个集合容器
(3)map的大小
map.size();//返回容器中元素的数目map.empty();//判断容器是否为空
(4)map的删除
map.clear();//删除所有元素map.erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。map.erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。map.erase(keyElem);//删除容器中key为keyElem的对组。
(5)map的查找
map.find(key);查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();map.count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
完整示例代码:
#include <iostream>
#include <map>using namespace std;int main()
{map<int, string> m; //key是int类型 value是string类型m.insert(pair<int, string>(3, "aa")); //通过pair对组(组合一组数据)插入m.insert(pair<int, string>(1, "zz"));m.insert(make_pair(5, "cc")); //通过make_pair组合一对数据插入m.insert(make_pair(4, "ff"));m.insert(map<int, string>::value_type(6, "hh")); //通过map内部静态成员函数插入m.insert(map<int, string>::value_type(2, "dd"));m[8] = "uu"; //map重载了[]运算符m[7] = "ee";//遍历结果 按照key自动排序for (map<int, string>::iterator it = m.begin(); it != m.end(); it++){//it指向map的一个结点,一个结点就是一个pair对象,即it指向pair对象,pair对象有两个成员,first和secondcout << "学号 " << it->first << " 姓名 " << it->second << endl; }//前三种插入方法,如果数据已经存在则返回错误;第四种方法,如果数据存在则覆盖(不太安全)pair<map<int, string>::iterator, bool> p = m.insert(make_pair(5, "qq"));if (p.second == false){cout << "插入失败" << endl; //返回的迭代器指向已经存在的结点cout << "学号 " << p.first->first << " 姓名 " << p.first->second << endl;}else{cout << "插入成功" << endl;}m[3] = "www"; //直接把原有的数据覆盖for (map<int, string>::iterator it = m.begin(); it != m.end(); it++){cout << "学号 " << it->first << " 姓名 " << it->second << endl; }cout << "map删除指定的位置" << endl;m.erase(m.begin());for (map<int, string>::iterator it = m.begin(); it != m.end(); it++){cout << "学号 " << it->first << " 姓名 " << it->second << endl; }cout << "map删除区间" << endl;m.erase(--(m.end()), m.end());for (map<int, string>::iterator it = m.begin(); it != m.end(); it++){cout << "学号 " << it->first << " 姓名 " << it->second << endl; }cout << "map删除具体元素" << endl;m.erase(4); //根据k值删除for (map<int, string>::iterator it = m.begin(); it != m.end(); it++){cout << "学号 " << it->first << " 姓名 " << it->second << endl; }return 0;
}
运算结果:

(6)multimap
- Multimap:1个key值可以对应多个value
Multimap 案例:
公司有销售部 sale (员工2名)、技术研发部 development (1人)、财务部 Financial (2人)
人员信息有:姓名,年龄,电话、工资等组成
通过 multimap进行 信息的插入、保存、显示
分部门显示员工信息
示例代码:
#include <iostream>
#include <map>using namespace std;class Employee
{
private:int id;string name;
public:Employee(int i, string n){id = i;name = n;}void show(){cout << "工号:" << id << " 姓名:" << name << endl; }
};int main()
{Employee e1(1, "aa");Employee e2(2, "aa");Employee e3(3, "aa");Employee e4(4, "aa");Employee e5(5, "aa");Employee e6(6, "aa");Employee e7(7, "aa");Employee e8(8, "aa");multimap<string, Employee> m;//销售部门有三个员工m.insert(make_pair("sale", e1));m.insert(make_pair("sale", e2));m.insert(make_pair("sale", e3));//研发部门一个员工m.insert(make_pair("development", e4));//财务部门4个员工m.insert(make_pair("financial", e5));m.insert(make_pair("financial", e6));m.insert(make_pair("financial", e7));m.insert(make_pair("financial", e8));cout << m.count("financial") << endl;for (multimap<string, Employee>::iterator it = m.begin(); it != m.end(); it++){cout << "部门:" << it->first << endl;it->second.show();}return 0;
}
运行结果:

相关文章:
C++回顾(二十五)—— map/multimap容器
25.1 map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对。它提供基于key的快速检索能力。map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。map的…...
7.3 向量的数量积与向量积
🙌作者简介:数学与计算机科学学院出身、在职高校高等数学专任教师,分享学习经验、生活、 努力成为像代码一样有逻辑的人! 🌙个人主页:阿芒的主页 ⭐ 高等数学专栏介绍:本专栏系统地梳理高等数学…...
Qt静态扫描(命令行操作)
Qt静态扫描(命令行操作) 前沿: 静态代码分析是指无需运行被测代码,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌…...
【Hadoop】配置文件
Hadoop 配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认 配置值时,才需要修改自定义配置文件,更改相应属性值 (1)默认配置文件: cd $HADOOP_HOME/share/hadoop common路…...
python进程池
Python进程池是Python标准库中multiprocessing模块提供的一种用于管理进程的方式。它可以使Python程序以并行的方式执行任务,提高程序的运行效率。本篇博客将介绍如何使用Python进程池。 创建进程池 在使用Python进程池之前,我们需要先创建一个进程池对…...
笔记本固态盘数据丢失怎么办?笔记本固态盘怎么恢复数据
如果笔记本固态盘数据丢失怎么办?笔记本固态盘怎么恢复数据?下面将为大家详细地介绍一下笔记本固态硬盘数据恢复的三种实用方法,希望对大家有所帮助。一、简单恢复方法笔记本固态硬盘数据删除以后,较为简单直接的恢复方法就是从回…...
堆的结构与实现
堆的结构与实现二叉树的顺序结构堆的概念及结构堆的实现堆的创建向上调整建堆向下调整建堆堆的操作链接二叉树的顺序结构 堆其实是具有一定规则限制的完全二叉树。 普通的二叉树是不太适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树会更适合使用顺…...
Pandas快速入门
Pandas是Python中非常流行的数据处理库之一,它提供了一种简单而强大的方法来处理和分析数据。在本篇文章中,我将向你介绍Pandas的基础知识,以便你可以开始使用它来处理和分析数据。 安装Pandas 首先,你需要安装Pandas。可以通过…...
LVGL学习笔记18 - 表Table
目录 1. Parts 1.1 LV_PART_MAIN 1.2 LV_PART_ITEMS 2. 样式 2.1 设置行列数 2.2 设置单元格字符串 2.3 设置单元格宽度 2.4 设置表格高度和宽度 2.5 设置字符串颜色 2.6 设置边框颜色 2.7 设置背景颜色 3. 事件 4. CELL CTRL 表格是由包含文本的行、列和单元格构…...
嵌入式安防监控项目——html框架分析和环境信息刷新到网页
目录 一、html控制LED 二、模拟数据上传到html 一、html控制LED 简单来说就是html给boa服务器发了一个控制指令信息,然后boa转发给cgi进程,cgi通过消息队列和主进程通信。主进程再去启动LED子线程。 这是老师给的工程。 以前学32都有这工具那工具来管…...
centos安装docker详细步骤
目录 一.前言 1.环境要求2.官网中文安装参考手册 二.安装步骤 1.卸载旧版本2.安装需要的软件包3.设置docker镜像源 1.配置docker镜像源 方式1:官网地址(外国):方式2:阿里云源:2.查看配置是否成功 4.更新yum软件包索引5.可以查看…...
初识HTML、W3C标准、如何利用IDEA创建HTML项目、HTML基本结构、网页基本信息
一、什么是HTML? HTML——Hyper Text Markup Languagr(超文本标记语言) 超文本包括:文字、图片、音频、视频、动画等 目前网页中常用——HTML5 HTML5提供了一些新的元素和一些有趣的新特性,同时也建立了一些新的规则…...
为什么程序员喜欢这些键盘?
文章目录程序员的爱介绍个人体验程序员的爱 程序员是长时间使用计算机的群体,他们需要一款高品质的键盘来保证舒适的打字体验和提高工作效率。在键盘市场上,有很多不同类型的键盘,但是对于程序员来说,机械键盘是他们最钟爱的选择…...
JS中数组去重的几种方法
JS 中有多种方法可以实现数组去重,下面是几种常用的方法:1、使用 Set 去重:Set 数据结构中不能有重复元素,可以将数组转成 Set 类型,再转回数组。let arr [1,2,3,4,5,6,2,3,4]; let uniqueArr [...new Set(arr)]; co…...
Nginx 配置实例-负载均衡
一、实现效果 浏览器地址栏输入地址 http://192.168.137.129/edu/a.html,负载均衡效果,将请求平均分配到8080和8081两台服务器上。 二、准备工作 1. 准备两台tomcat服务器,一台8080,一台8081 (具体操作如下两个链接) Nginx配置实…...
引出生命周期、生命周期_挂载流程、生命周期_更新流程、生命周期_销毁流程、生命周期_总结——Vue
目录 一、引出生命周期 二、生命周期_挂载流程 三、生命周期_更新流程 四、生命周期_销毁流程 五、生命周期_总结 一、引出生命周期 生命周期: 1.又名:生命周期回调函数、生命周期函数、生命周期钩子。 2.是什么:Vue在关键时刻帮我们调…...
C++ STL学习之【vector的使用】
✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 The power of imagination makes us infinite. 想象力的力量使我们无限。 文章目录📘前言📘正文1、默认成员函数1.1、默认构造…...
方差分析与单因素方差分析
研究分类型自变量对数值型因变量的影响。检验统计的设定和检验方法与变量间的方差是否相等有关。 例如研究行业、服务等级对投诉数的影响:如表格中给出4个行业、每个行业有3个服务等级、样本容量为7、观测值为投诉数。则构成一个3维的矩阵。 在上述基础上…...
分布式链路追踪组件skywalking介绍
SkyWalking组件概念 一个开源的可观测平台, 用于从服务和云原生基础设施收集, 分析, 聚合及可视化数据。SkyWalking 提供了一种简便的方式来清晰地观测分布式系统, 甚至横跨多个云平台。SkyWalking 更是一个现代化的应用程序性能监控(Application Performance Monitoring)系统…...
SUBMIT的用法
SUBMIT的用法 一、简介 系统MB52/MB51/MB5B等类似的报表 ,虽然数据很全面,执行效率也够快,但是经常会不满足用户需求(增添字段、添加查询条件等),很多ABAP 会选择去COPY出标准程序,然后去做修改…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
【导读】 本文针对无人机(UAV)视频中目标尺寸小、运动快导致的多目标跟踪难题,提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪(贴合无人机场景特性),并改进传统外观匹配算法以关联此类检测…...
Flask+LayUI开发手记(八):通用封面缩略图上传实现
前一节做了头像上传的程序,应该说,这个程序编写和操作都相当繁琐,实际上,头像这种缩略图在很多功能中都会用到,屏幕界面有限,绝不会给那么大空间摆开那么大一个界面,更可能的处理,就…...
