11.map 容器

11、map 容器

简介:

  • map 中所有元素都是 pair
  • pair 中第一个元素为 key(键值),起到索引作用,第二个元素为 value(实值)
  • 所有元素都会根据元素的键值自动排序

本质:

  • map/multimap 属于关联式容器,底层结构是用二叉树实现。

优点:

  • 可以根据 key 值快速找到 value 值

map 和 multimap 区别:

  • map 不允许容器中有重复 key 值元素

  • multimap 允许容器中有重复 key 值元素

11.1 map 构造和赋值

功能描述:

  • 对 map 容器进行构造和赋值操作

函数原型:

构造:

map<T1, T2>mp;	   // map 默认构造函数
map(const map &mp);// 拷贝构造函数

赋值:

map& operator=(const map &mp); // 重载等号操作符
#include <iostream>
#include <map>
using namespace std;void printMap(map<int, int>& m) {for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {cout << "key = " << it->first << " value = " << it->second << endl;}cout << endl;
}
void test01() {map<int, int > m;		// 默认构造函数m.insert(pair<int, int>(1, 10));m.insert(pair<int, int>(2, 20));m.insert(pair<int, int>(3, 30));printMap(m);map<int, int>m2(m);printMap(m2);map<int, int>m3;m3 = m2;printMap(m3);}int main() {test01();system("pause");return 0;
}

总结:

  • map 中所有元素都是成对出现,插入数据时候要使用对组

11.2 map 大小和交换

功能描述:

  • 统计 map 容器大小以及交换 map 容器

函数原型:

size();		// 返回容器元素的数目
empty();	// 判断容器是否为空
swap(st);	// 交换两个集合容器
#include <iostream>
#include <map>
using namespace std;void printMap(map<int, int>& m) {for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {cout << "key = " << it->first << "  value = " << it->second << endl;}cout << endl;
}void test01() {map<int, int>m;m.insert(pair<int, int>(1, 10));m.insert(pair<int, int>(2, 20));m.insert(pair<int, int>(3, 30));if (m.empty()) {cout << "m为空" << endl;}else {cout << "m不为空" << endl;cout << "m的大小不为空:" << m.size() << endl;}
}void test02()
{map<int, int>m;m.insert(pair<int, int>(1, 10));m.insert(pair<int, int>(2, 20));m.insert(pair<int, int>(3, 30));map<int, int>m2;m2.insert(pair<int, int>(4, 100));m2.insert(pair<int, int>(5, 200));m2.insert(pair<int, int>(6, 300));cout << "交换前" << endl;printMap(m);printMap(m2);cout << "交换后" << endl;m.swap(m2);printMap(m);printMap(m2);
}int main() {test01();test02();system("pause");return 0;
}

总结:

  • 统计大小 — size
  • 判断是否为空 — empty
  • 交换容器 — swap

11.3 map 插入和删除

功能描述:

  • map 容器进行插入数据和删除数据

函数原型:

insert(elem);	// 在容器中插入元素。
clear();		// 清除所有元素
erase(pos);		// 删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);// 删除区间 [beg,end) 的所有元素 ,返回下一个元素的迭代器。
erase(key);		// 删除容器中值为 key 的元素
#include <iostream>
#include <map>
using namespace std;
void printMap(map<int, int>& m) {for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {cout << "key = " << it->first << " vlaue = " << it->second << endl;}cout << endl;
}void test01() {// 插入map<int, int> m;m.insert(pair<int, int>(1, 10));m.insert(make_pair(2, 20));m.insert(map<int, int>::value_type(3, 30));m[4] = 40;printMap(m);m.erase(m.begin());printMap(m);m.erase(3);printMap(m);
}int main() {test01();system("pause");return 0;
}

总结:

  • map 插入方式很多,记住其一即可

  • 插入 — insert

  • 删除 — erase

  • 清空 — clear

11.4 map 查找和统计

功能描述:

  • 对 map 容器进行查找数据以及统计数据

函数原型:

find(key); 		// 查找 key 是否存在,若存在,返回该键的元素的迭代器;若不存在,返回
set.end();
count(key);		// 统计 key 的元素个数
#include <iostream>
#include <map>
using namespace std;// 查找和统计
void test01() {map<int, int>m;m.insert(pair<int, int>(1, 10));m.insert(pair<int, int>(2, 20));m.insert(pair<int, int>(3, 40));// 查找map<int, int>::iterator pos = m.find(3);if (pos != m.end()) {cout << "找到了元素 key = " << (*pos).first << " value = " << (*pos).second << endl;}else {cout << "未找到元素" << endl;}// 统计int num = m.count(3);cout << "num = " << num << endl;
}int main() {test01();system("pause");return 0;
}

总结:

  • 查找 — find (返回的是迭代器)
  • 统计 — count (对于 map,结果为0或者1)

11.5 map 容器排序

学习目标:

  • map 容器默认排序规则为:按照 key 值进行从小到大排序,掌握如何改变排序规则

主要技术点:

  • 利用仿函数,可以改变排序规则
#include <iostream>
#include <map>
using namespace std;class MyCompare {
public:bool operator()(int v1, int v2)const {return v1 > v2;}
};void test01() {// 默认从小到大排序// 利用仿函数从大到小排序map<int, int, MyCompare> m;m.insert(make_pair(1, 10));m.insert(make_pair(2, 20));m.insert(make_pair(3, 30));m.insert(make_pair(4, 40));m.insert(make_pair(5, 50));for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); ++it) {cout << "key:" << it->first << " value:" << it->second << endl;}
}int main() {test01();system("pause");return 0;
}

总结:

  • 利用仿函数可以指定 map 容器的排序规则
  • 对于自定义数据类型,map 必须要指定排序规则,同 set 容器

11.6 案例 — 员工分组

案例描述:

  • 公司今天招聘了10个员工( ABCDEFGHIJ ),10名员工进入公司之后,需要指派员工在那个部门工作
  • 员工信息有: 姓名 工资组成;部门分为:策划、美术、研发
  • 随机给10名员工分配部门和工资
  • 通过 multimap 进行信息的插入 key(部门编号) value(员工)
  • 分部门显示员工信息
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <ctime>
using namespace std;/*
- 公司今天招聘了10个员工(ABCDEFGHIJ),10名员工进入公司之后,需要指派员工在那个部门工作
- 员工信息有: 姓名 工资组成;部门分为:策划、美术、研发
- 随机给10名员工分配部门和工资
- 通过 multimap 进行信息的插入 key(部门编号) value(员工)
- 分部门显示员工信息
*/#define CEHUA 0
#define MEISHU 1
#define YANFA 2class Worker {
public:string m_Name;int m_Salary;
};void createWorker(vector<Worker>& v) {string nameSeed = "ABCDEFGHIJ";for (int i = 0; i < 10; ++i) {Worker worker;worker.m_Name = "员工";worker.m_Name += nameSeed[i];worker.m_Salary = rand() % 10000 + 10000;// 10000 ~ 19999// 将员工放入到容器中v.push_back(worker);}
}//员工分组
void setGroup(vector<Worker>& v, multimap<int, Worker>& m) {for (vector<Worker>::iterator it = v.begin(); it != v.end(); ++it) {// 产生随机部门编号int deptId = rand() % 3;//0 1 2// 将员工插入到分组中// key 部门编号,value 具体员工m.insert(make_pair(deptId, *it));}
}void showWorkerByGroup(multimap<int, Worker>& m) {//0 A B C 1 D E 2 F G ...cout << "策划部门:" << endl;multimap<int, Worker>::iterator pos = m.find(CEHUA);int count = m.count(CEHUA);int index = 0;for (; pos != m.end() && index < count; pos++, index++) {cout << "姓名:" << pos->second.m_Name << " 工资:" << pos->second.m_Salary << endl;}cout << "---------------------------------" << endl;cout << "研发部门:" << endl;pos = m.find(YANFA);count = m.count(YANFA);index = 0;for (; pos != m.end() && index < count; pos++, index++) {cout << "姓名:" << pos->second.m_Name << " 工资:" << pos->second.m_Salary << endl;}cout << "---------------------------------" << endl;cout << "美术部门:" << endl;pos = m.find(MEISHU);count = m.count(MEISHU);index = 0;for (; pos != m.end() && index < count; pos++, index++) {cout << "姓名:" << pos->second.m_Name << " 工资:" << pos->second.m_Salary << endl;}cout << "---------------------------------" << endl;
}int main() {srand((unsigned)time(NULL));// 1、创建员工vector<Worker> vWorker;createWorker(vWorker);// 2、员工分组multimap<int, Worker>mWorker;setGroup(vWorker, mWorker);// 3、显示员工分组showWorkerByGroup(mWorker);// 测试for (vector<Worker>::iterator it = vWorker.begin(); it != vWorker.end(); it++) {cout << "姓名: " << it->m_Name << " 工资: " << it->m_Salary << endl;}system("pause");return 0;
}

总结:

  • 当数据以键值对形式存在,可以考虑用 map 或 multimap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何发送大型文件 ---- 分卷压缩

不知道各位小伙伴有没有这样的烦恼&#xff0c;发送很大很大的压缩包会受到限制&#xff0c;比如QQ邮箱需要付费来进行中转的扩容&#xff0c;下面我将会介绍一种分卷压缩的方法来传送较大的压缩包给对方 使用7-zip软件进行分卷压缩 如果有7-zip压缩软件直接跳过这一步 7-zi…

利用Milvus Cloud和LangChain构建机器人:一种引人入胜且通俗易懂的方法

一、引言 机器人已经深入我们的日常生活&#xff0c;从家庭服务到工业生产&#xff0c;再到医疗和运输等领域。然而&#xff0c;这些机器人往往需要复杂的算法和数据处理技术才能有效地执行任务。在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#…

Spring Boot快速搭建一个简易商城项目【一展示商城首页篇】

前言&#xff1a;今天我来使用Spring Boot快速搭建一个简易商城项目以下是相关的思路流程&#xff0c;如果有更好的思路&#xff0c;欢迎大佬评论留言&#xff01;&#xff01;&#xff01; 一&#xff0c;实现思路&#xff1a; 创建 Spring Boot 项目&#xff1a; 使用 Spring…

一种用于解决子图同构问题的子图特定因子

判断两个图是否同构可以从两个方面考虑 当两个图的节点的个数不等时&#xff1a;显然&#xff0c;这两个图是不可能同构。当两个图的节点的个数相等时&#xff1a;此时&#xff0c;需根据邻接矩阵的特征值来进行区分。例&#xff1a;两个图的邻接矩阵分别为 A , A ′ ∈ R n …

Hikvision SPON IP网络对讲广播系统存在命令执行漏洞CVE-2023-6895 附POC软件

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. Hikvision SPON IP网络对讲广播系统简介 微信公众…

理解文件系统

一 什么是文件系统 文件系统是计算机操作系统中的一个核心组件&#xff0c;用于管理计算机中的文件和文件夹。它提供了一种组织和访问计算机存储设备上数据的方式。文件系统使用户能够创建、修改、删除和查找文件&#xff0c;以及组织文件和文件夹的层次结构。 ps: linux一共有…

全局代理的詳細使用指南(Windows、Mac、Android、iOS)

全局代理IP又稱全局IP代理&#xff0c;允許用戶通過一個代理伺服器來發送和接收互聯網上的資訊。這個代理伺服器會隱藏用戶的真實IP地址&#xff0c;並將其替換為代理伺服器的IP地址。 除了常見的提高網路安全保護和突破地理限制的功能外&#xff0c;全局代理IP還可以做到以下…

C语言例题6

1.以下程序运行后的输出结果是&#xff1a;17。 main() {int x15; while(x>10&&x<50) {x; if (x/3) {x ; break;} else continue;} printf("%d\n",x); } 首先&#xff0c;我们分析程序中的逻辑和操作。 初始化 x 为 15。进入 while 循环&…

【FPGA】高云FPGA之科学的FPGA开发流程

FPGA开发流程 开发流程1、设计定义2、设计输入3、分析和综合4、功能仿真5、布局布线6、时序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;烧录&#xff09;FPGA9、在线调试 例子1、设计定义1.1 需求1.2 原理图1.3 真值表 2、设计输入2…

HTML 实操试题(一)

创建一个包含标题、段落和链接的基本HTML文档&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…

Docker - 镜像 | 容器 | 数据卷 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…

软件测试/测试开发丨Pytest学习笔记

Pytest 格式要求 文件: 以 test_ 开头或以 _test 结尾类: 以 Test 开头方法/函数: 以 _test 开头测试类中不可以添加构造函数, 若添加构造函数将导致Pytest无法识别类下的测试方法 断言 与Unittest不同, 在Pytest中我们需要使用python自带的 assert 关键字进行断言 assert…

SpringBoot实用开发(五)-- RedisTemplate处理String类型的数据

目录 1. 新增操作 2. 查看操作 3. 批量获取value值 4. 返回value的长度 5.

中介者模式-Mediator Pattern-1

如果在一个系统中对象之间的联系呈现为网状结构&#xff0c; 对象之间存在大量的多对多联系&#xff0c;将导致系统非常复杂。 这些对象既会影响别的对象&#xff0c;也会被别的对象所影响。 这些对象称为同事对象&#xff0c;它们之间通过彼此的相互作用实现系统的行为。 在网…

找不到msvcp140.dll怎么办-msvcp140.dll丢失的解决方法分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。那么&#xff0c;msvcp140.dll究竟是什么文件&#xff1f;为什么会出现丢失的情况&#xff1f;本文将详细介绍msvcp140.dll的属性、作用以及丢失的原因&#xff0c;并…

Java学习笔记(八)——面向对象编程(高级)

目录 一、类变量和类方法 &#xff08;一&#xff09;类变量/静态变量 类变量内存布局 类变量使用注意事项和细节 &#xff08;二&#xff09;类方法 类方法经典的使用场景 类方法使用注意事项和细节 二、理解main方法语法 三、代码块 代码块使用注意事项和细节 四、…

Graylog日志搜索技巧

graylog搜索日志用的语法是Syntax接近Lucene&#xff0c;搜起来比较方便 Search query languagehttps://go2docs.graylog.org/4-0/making_sense_of_your_log_data/writing_search_queries.html?tocpathSearching%20Your%20Log%20Data|_____1 1.Syntax 语法 1.1 基本匹配 搜…

java keytool.exe ssl

JDK如果没有先安装 JDK8 install_jdk aleady install-CSDN博客 java keytool.exe ssl keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore D:\server.keystore -validity 3650 server.ssl.key-storeD:\server.keystore server.ssl.key-…

怎么使用jupter notebook并配置环境变量

有的时候需要使用Jupyter Notebook运行代码&#xff0c;Jupyter Notebook的主要特点&#xff1a; ① 编程时具有语法高亮、缩进、tab补全的功能。 ② 可直接通过浏览器运行代码&#xff0c;同时在代码块下方展示运行结果。 ③ 以富媒体格式展示计算结果。富媒体格式包括&…