当前位置: 首页 > news >正文

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是标准的关联式容器&#xff0c;一个map是一个键值对序列&#xff0c;即(key,value)对。它提供基于key的快速检索能力。map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入&#xff0c;所以不能指定插入位置。map的…...

7.3 向量的数量积与向量积

&#x1f64c;作者简介&#xff1a;数学与计算机科学学院出身、在职高校高等数学专任教师&#xff0c;分享学习经验、生活、 努力成为像代码一样有逻辑的人&#xff01; &#x1f319;个人主页&#xff1a;阿芒的主页 ⭐ 高等数学专栏介绍&#xff1a;本专栏系统地梳理高等数学…...

Qt静态扫描(命令行操作)

Qt静态扫描&#xff08;命令行操作&#xff09; 前沿&#xff1a; 静态代码分析是指无需运行被测代码&#xff0c;通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描&#xff0c;找出代码隐藏的错误和缺陷&#xff0c;如参数不匹配&#xff0c;有歧义的嵌…...

【Hadoop】配置文件

Hadoop 配置文件分两类&#xff1a;默认配置文件和自定义配置文件&#xff0c;只有用户想修改某一默认 配置值时&#xff0c;才需要修改自定义配置文件&#xff0c;更改相应属性值 &#xff08;1&#xff09;默认配置文件&#xff1a; cd $HADOOP_HOME/share/hadoop common路…...

python进程池

Python进程池是Python标准库中multiprocessing模块提供的一种用于管理进程的方式。它可以使Python程序以并行的方式执行任务&#xff0c;提高程序的运行效率。本篇博客将介绍如何使用Python进程池。 创建进程池 在使用Python进程池之前&#xff0c;我们需要先创建一个进程池对…...

笔记本固态盘数据丢失怎么办?笔记本固态盘怎么恢复数据

如果笔记本固态盘数据丢失怎么办&#xff1f;笔记本固态盘怎么恢复数据&#xff1f;下面将为大家详细地介绍一下笔记本固态硬盘数据恢复的三种实用方法&#xff0c;希望对大家有所帮助。一、简单恢复方法笔记本固态硬盘数据删除以后&#xff0c;较为简单直接的恢复方法就是从回…...

堆的结构与实现

堆的结构与实现二叉树的顺序结构堆的概念及结构堆的实现堆的创建向上调整建堆向下调整建堆堆的操作链接二叉树的顺序结构 堆其实是具有一定规则限制的完全二叉树。 普通的二叉树是不太适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树会更适合使用顺…...

Pandas快速入门

Pandas是Python中非常流行的数据处理库之一&#xff0c;它提供了一种简单而强大的方法来处理和分析数据。在本篇文章中&#xff0c;我将向你介绍Pandas的基础知识&#xff0c;以便你可以开始使用它来处理和分析数据。 安装Pandas 首先&#xff0c;你需要安装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服务器发了一个控制指令信息&#xff0c;然后boa转发给cgi进程&#xff0c;cgi通过消息队列和主进程通信。主进程再去启动LED子线程。 这是老师给的工程。 以前学32都有这工具那工具来管…...

centos安装docker详细步骤

目录 一.前言 1.环境要求2.官网中文安装参考手册 二.安装步骤 1.卸载旧版本2.安装需要的软件包3.设置docker镜像源 1.配置docker镜像源 方式1&#xff1a;官网地址(外国)&#xff1a;方式2&#xff1a;阿里云源&#xff1a;2.查看配置是否成功 4.更新yum软件包索引5.可以查看…...

初识HTML、W3C标准、如何利用IDEA创建HTML项目、HTML基本结构、网页基本信息

一、什么是HTML&#xff1f; HTML——Hyper Text Markup Languagr&#xff08;超文本标记语言&#xff09; 超文本包括&#xff1a;文字、图片、音频、视频、动画等 目前网页中常用——HTML5 HTML5提供了一些新的元素和一些有趣的新特性&#xff0c;同时也建立了一些新的规则…...

为什么程序员喜欢这些键盘?

文章目录程序员的爱介绍个人体验程序员的爱 程序员是长时间使用计算机的群体&#xff0c;他们需要一款高品质的键盘来保证舒适的打字体验和提高工作效率。在键盘市场上&#xff0c;有很多不同类型的键盘&#xff0c;但是对于程序员来说&#xff0c;机械键盘是他们最钟爱的选择…...

JS中数组去重的几种方法

JS 中有多种方法可以实现数组去重&#xff0c;下面是几种常用的方法&#xff1a;1、使用 Set 去重&#xff1a;Set 数据结构中不能有重复元素&#xff0c;可以将数组转成 Set 类型&#xff0c;再转回数组。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&#xff0c;负载均衡效果&#xff0c;将请求平均分配到8080和8081两台服务器上。 二、准备工作 1. 准备两台tomcat服务器&#xff0c;一台8080&#xff0c;一台8081 (具体操作如下两个链接) Nginx配置实…...

引出生命周期、生命周期_挂载流程、生命周期_更新流程、生命周期_销毁流程、生命周期_总结——Vue

目录 一、引出生命周期 二、生命周期_挂载流程 三、生命周期_更新流程 四、生命周期_销毁流程 五、生命周期_总结 一、引出生命周期 生命周期&#xff1a; 1.又名&#xff1a;生命周期回调函数、生命周期函数、生命周期钩子。 2.是什么&#xff1a;Vue在关键时刻帮我们调…...

C++ STL学习之【vector的使用】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 The power of imagination makes us infinite. 想象力的力量使我们无限。 文章目录&#x1f4d8;前言&#x1f4d8;正文1、默认成员函数1.1、默认构造…...

方差分析与单因素方差分析

研究分类型自变量对数值型因变量的影响。检验统计的设定和检验方法与变量间的方差是否相等有关。 例如研究行业、服务等级对投诉数的影响&#xff1a;如表格中给出4个行业、每个行业有3个服务等级、样本容量为7、观测值为投诉数。则构成一个3维的矩阵。 在上述基础上&#xf…...

分布式链路追踪组件skywalking介绍

SkyWalking组件概念 一个开源的可观测平台, 用于从服务和云原生基础设施收集, 分析, 聚合及可视化数据。SkyWalking 提供了一种简便的方式来清晰地观测分布式系统, 甚至横跨多个云平台。SkyWalking 更是一个现代化的应用程序性能监控(Application Performance Monitoring)系统…...

SUBMIT的用法

SUBMIT的用法 一、简介 系统MB52/MB51/MB5B等类似的报表 &#xff0c;虽然数据很全面&#xff0c;执行效率也够快&#xff0c;但是经常会不满足用户需求&#xff08;增添字段、添加查询条件等&#xff09;&#xff0c;很多ABAP 会选择去COPY出标准程序&#xff0c;然后去做修改…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...