C++:map容器的使用
一、map的使用介绍
map文档介绍
1.1 map的模版参数

Key:键值对中Key的类型
T:键值对中value的类型
Compare:比较器的类型,map中的元素是按照Key来进行比较的,缺省情况(不传参数时)按照小于来比较,一般情况下(内置类型的元素)不需要传递该参数,对于自定义类型无法进行比较时,需要用户自己显式的进行传递比较规则(这里一般是传入仿函数或者函数指针)
Alloc:通过空间配置器来申请底层空间, 不需要用户传递,但是如果不想使用标准库提供的空间配置器时可以自己传递。
注意:使用map时,需要包含
1.2 map的构造

- 默认构造:构造一个空的map,不需要传参
- 使用迭代器区间构造
- 拷贝构造
实例:
void test1()
{//使用无参构造,构造出一个空mapmap<int, int> m;vector<pair<int, int>>tmp = { {1, 2}, {2, 3}, {3, 4}, {4, 5} };//使用迭代器区间构造一个mapmap<int, int> m1(tmp.begin(), tmp.end());cout << "迭代器区间构造:" << endl;for (auto e : m1){cout << e.first << ":" << e.second << endl;}cout << endl;//使用拷贝构造,构造一个mapmap<int, int> m2(m1);cout << "拷贝构造:" << endl;for (auto e : m2){cout << e.first << ":" << e.second << endl;}cout << endl;
}
运行结果:

1.3 map的迭代器

- begin():返回首元素位置的迭代器
- end(): 返回最后一个元素的下一个位置的迭代器
- cbegin(): 返回首元素位置的const迭代器(也就是不能对元素进行修改的迭代器)
- cend(): 返回最后一个元素的下一个位置的const迭代器
- rbegin(): 反向迭代器,返回最后一个元素的下一个位置的反向迭代器相当于end(),++反向迭代器会向前遍历
- rend(): 反向迭代器,返回首元素位置的反向迭代器,相当于begin(), --反向迭代器会向后遍历
- crbegin(): 反向const迭代器,返回最后一个元素的下一个位置的反向const迭代器相当于cend(),++反向迭代器会向前遍历
- crend(): 反向迭代器,返回首元素位置的反向const迭代器,相当于cbegin(), --反向迭代器会向后遍历
注意:使用const迭代器时不能对指向的元素进行修改,否则编译器会进行报错,如下所示:


实例:
void test2()
{std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };std::map<int, int>::iterator it1 = m1.begin();cout << "正向迭代器: " << endl;while (it1 != m1.end()){cout << it1->first << ":" << it1->second << endl;++it1;}cout << endl;std::map<int, int>::const_iterator it2 = m1.cbegin();cout << "正向const迭代器: " << endl;//const迭代器不能对指向元素进行修改,进行修改会报错while (it2 != m1.cend()){cout << it2->first << ":" << it2->second << endl;++it2;}cout << endl;std::map<int, int>::reverse_iterator it3 = m1.rbegin();cout << "反向迭代器: " << endl;while (it3 != m1.rend()){cout << it3->first << ":" << it3->second << endl;++it3;}cout << endl;
}
运行结果:

1.4 map的容量和元素访问
容量:

empty:如果map容器内是空的话就返回true否则返回false
size:返回map中的有效元素个数
元素访问:

operator[] :根据key去查找value,如果没有对应的key就进行插入
实例:
void test3()
{std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };//容量if (!m1.empty())cout << "map不为空" << endl;elsecout << "map为空" << endl;cout << "map内的有效元素个数:" << m1.size() << endl;//元素访问cout << "m1[1] == " << m1[1] << " " << "m1[2] == " << m1[2] << endl;//使用operator[]时如果没有对应的key则会进行插入, 插入后value默认给0cout << "m1[100] == " << m1[100] << endl;
}
运行结果:

1.5 map的元素修改

- 使用一个键值对进行插入,val是一个键值对,返回值是一个pair类型,iterator是插入位置的迭代器,bool返回的是是否插入成功,插入成功放回true,否则返回false
- 插入一个键值对val, 插入 val 到尽可能接近正好在 pos 之前的位置。
- 插入来自范围
[first,last)的元素。优先插入键值与map中元素不重叠的元素,如果范围中的多个元素的键比较相等,标准库里没有确定插入规则。
实例:
void test4()
{std::map<int, int> m1;//插入一个键值对m1.insert(make_pair(1, 2));for (auto e : m1){cout << e.first << ":" << e.second << endl;}cout << endl;//在尽可能接近pos插入一个键值对m1.insert(m1.begin(), make_pair(2, 5));for (auto e : m1){cout << e.first << ":" << e.second << endl;}cout << endl;//使用迭代器范围插入vector<pair<int, int>> tmp = { {1, 3}, {4, 2} };m1.insert(tmp.begin(), tmp.end());for (auto e : m1){cout << e.first << ":" << e.second << endl;}cout << endl;
}
运行结果:


- 按迭代器pos位置进行删除
- 按key进行删除
- 按迭代器区间进行删除
实例:
void test5()
{std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };for (auto e : m1){cout << e.first << ":" << e.second << endl;}cout << endl;//按pos位置进行删除auto it = m1.find(1);m1.erase(it);for (auto e : m1){cout << e.first << ":" << e.second << endl;}cout << endl;//按key删除m1.erase(2);for (auto e : m1){cout << e.first << ":" << e.second << endl;}cout << endl;//按迭代器区间进行删除m1.erase(m1.begin(), m1.end());if (m1.empty())cout << "m1已经为空" << endl;}
运行结果:


- 通过key进行查找返回普通迭代器,可以通过返回的迭代器对元素进行修改
- 通过key进行查找返回const迭代器,不能通过返回的迭代器读元素进行修改
实例:
void test6()
{std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };auto pos = m1.find(1);cout << pos->first << ":" << pos->second << endl;auto pos1 = m1.find(8);cout << pos1->first << ":" << pos->second << endl;
}
运行结果:


交换两个swap容器里面的元素。
实例:
void test7()
{std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };std::map<int, int> m2;//空map//交换前:cout << "交换前:" << endl;if (!m1.empty()){cout << "m1:" << endl;for (auto e : m1){cout << e.first << ":" << e.second << endl;}}else{cout << "m1为空" << endl;}if (!m2.empty()){cout << "m2:" << endl;for (auto e : m2){cout << e.first << ":" << e.second << endl;}}else{cout << "m2为空" << endl;}cout << endl;//交换后:cout << "交换后:" << endl;m2.swap(m1);if (!m1.empty()){cout << "m1:" << endl;for (auto e : m1){cout << e.first << ":" << e.second << endl;}}else{cout << "m1为空" << endl;}if (!m2.empty()){cout << "m2:" << endl;for (auto e : m2){cout << e.first << ":" << e.second << endl;}}else{cout << "m2为空" << endl;}cout << endl;
}
运行结果:


clear:将一个map里的元素清空。
实例:
void test8()
{std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };if (!m1.empty())cout << "m1的有效数据个数:" << m1.size() << endl;elsecout << "m1为空" << endl;//清空m1m1.clear();if (!m1.empty())cout << "m1的有效数据个数:" << m1.size() << endl;elsecout << "m1为空" << endl;
}
运行结果:


count返回key在map中出现的次数,但是map中key值是不允许重复的,因此返回值不是0,就是1。
可以利用这个特性来判断key是否在map中。
实例:
void test9()
{std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };int x = 0;cin >> x;if (m1.count(x))cout << "key为" << x << "的元素已经存在" << endl;elsecout << "key为" << x << "的元素不存在" << endl;
}
运行结果:

二、map总结
- map中的元素是键值对。
- map中的key是唯一的,并且key是不能进行修改的。
- 默认按照小于的方式对key进行排序。
- map中的元素通过迭代器去遍历,可以得到一个有序序列(map的底层是红黑树,迭代器走的是中序遍历,因此遍历得到的序列是有序的)。
- map的底层是红黑树,查找效率是O(logN)
- map支持[]操作符,重载了operator[]因此可以通过[]对val进行访问。
三、multimap
3.1 multimap的介绍
multimap文档介绍

multimap和map只有一点不同,map的key是唯一的,multimap的key是可以重复的。
multimap的其他方面基本与map相同,使用时需要包含
注意:multimap中没有重载operator[]运算符,因为key不是唯一的不能通过key来对val进行访问。
3.2 multimap的使用
实例:
void test_multimap()
{std::multimap<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10}, {1, 3}, { 2, 6 }, {3, 7} };for (auto e : m1){cout << e.first << ":" << e.second << endl;}cout << endl;
}
运行结果:

四、 multimap总结
multimap的接口可以参考map的接口,功能基本相同。
- multimap中的key是可重复的。
- multimap中的元素默认按照小于比较。
- multimap中没有重载operator[]运算符。
- multimap使用时包含
这篇文章到这里就结束了,主要介绍了map的接口使用以及map和multimap的区别,希望大家通过这篇文章,能够对map的使用有所了解。
相关文章:
C++:map容器的使用
一、map的使用介绍 map文档介绍 1.1 map的模版参数 Key:键值对中Key的类型 T:键值对中value的类型 Compare:比较器的类型,map中的元素是按照Key来进行比较的,缺省情况(不传参数时)按照小于来…...
C++初学(10)
10.1、共用体 共用体是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。比如说:结构可以同时存储int、long、和double,而共用体只能存储int、long、或double。共用体的句式与结构相似,但含义不…...
在MAC安装Lazarus 起点 - 我们的第一个Lazarus程序!
安装Lazarus 首先到Lazarus官网,找到合适的版本下载页面,比如Mac的版本: https://sourceforge.net/projects/lazarus/files/Lazarus%20macOS%20x86-64/Lazarus%203.4/ 将三个文件都下载到本地,需要安装这三个文件: …...
【每日刷题】Day96
【每日刷题】Day96 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. LCP 44. 开幕式焰火 - 力扣(LeetCode) 2. 1022. 从根到叶的二进制数之和 - …...
EGO-Swarm 仿真环境搭建
EGO-Swarm仿真环境搭建 参考教程: https://github.com/ZJU-FAST-Lab/ego-planner-swarm EGO-Swarm是一种分散的异步系统解决方案,用于仅使用机载资源在未知的障碍物丰富的场景中进行多机器人自主导航。 1. 查看系统环境 要运行本仿真程序,…...
【EI会议征稿通知】第九届计算机技术与机械电气工程国际学术论坛(ISCME 2024)
会议官网:www.is-cme.com 一轮截稿时间:2024年8月16日(早投稿,早录用) 大会时间:2024年11月8-10日 大会地点:中国 南京 接受/拒稿通知:投稿后1-2周 收录检索:EI Compend…...
【starRocks-docker 部署问题汇总】
Starrocks系列文章目录 例如:starrocks 常见问题汇总 文章目录 Starrocks系列文章目录前言一、Starrocks-be运行一段时间后,容器无法restart?二、等待后续跟新 前言 starrocks基于docker-compose部署的3节点分布式(3FE,3BE),遇到的问题也都…...
threejs中,如何检测一个模型周边一定范围内的其它模型
在Three.js中,要检测一个模型(我们可以称之为“主体模型”)周边一定范围内的其他物体,你可以通过以下步骤来实现: 1、定义检测范围: 首先,确定你需要检测的范围,这通常是一个以主体…...
UDP端口可达性检测(端口扫描)工具开发
UDP端口可达性检测(端口扫描)工具开发 1、应用场景分析 主机X与主机Y部署在AB双网环境下,两个主机间通过UDP协议进行数据交互。应用程序发送数据时,优先使用A网发送数据,如果A网异常则通过B网发送数据。两个主机应用间没有设置心跳帧 &…...
第三届计算、通信、感知与量子技术国际会议(CCPQT 2024)会议通知
会议信息 大会官网:http://www.ccpqt.org/ 官方邮箱:ccpqt_paper126.com 会议地点:中国珠海 会议时间:2024年10月25日-10月27日 主讲嘉宾 Prof. Trung Q. Duong IEEE Fellow and AAIA Fellow Memorial University of Newfoundl…...
Qt文件读写
Qt中文件读写类简述 包含头文件#include <QFile> 读写模式如下 枚举 文件读写步骤 1 先使用string 类型来接受打开文件的返回值 QFileDialog::getOpenFileName(this,"文件","./"); //打开一个文件 2 构建文件对象 Qfile ff (qstring)接受打…...
发现了一套超厉害的英语资料,绝对YYDS
昨某节目主持人与我闲聊英语学习的事情。 她工作数年,希望提升英文资讯的阅读能力。她主持的是中文节目,但节目对个人的知识广度和深度要求颇高。 现在的知识又太泛太杂,你需要了解国外最新资讯,多获得一手资料,面对节…...
C# new关键字作用
在C#中,当子类定义了与父类同名的字段或者方法时,可以使用new关键字进行隐藏。使用new和不使用new关键字的区别主要在于如何处理字段的隐藏和可访问性。 讲人话就是,假设父类的字段或方法,子类是可以直接访问的(publi…...
Python代码之特征工程基础
1. 什么是特征工程 特征工程是指从原始数据中提取、转换和创建适合于模型训练的数据特征的过程。它是机器学习和深度学习中非常重要的一步,因为好的特征工程可以显著提高模型的性能。特征工程涉及从数据中提取有意义的信息,并将其转换为模型可以理解和使…...
低代码平台:效率利器还是质量妥协?
目录 低代码平台:效率利器还是质量妥协? 一、引言 二、低代码平台的定义和背景 1、什么是低代码平台? 2、低代码平台的兴起 三、低代码开发的机遇 1、提高开发效率 2、降低开发成本 3、赋能业务人员 四、低代码开发的挑战 1、质量…...
大数据-Big Data
1. 简介 1.1. 主要特点 大数据(Big Data)是指规模巨大、复杂多变的数据集合,这些数据集来源于多个不同的源,包括社交媒体、移动设备、物联网、传感器等。大数据的主要特点如下: 数据量大(Volume):大数据的起始计量单位是PB(1024TB)、EB(1024PB,约100万TB)或ZB(…...
Redis的持久化的策略
Redis的持久化的策略 官方文档说明 AOF持久化策略RDB持久化的策略 AOF持久化策略 AOF持久性记录服务器接收到的每个写操作,然后,可以在服务器启动时再次重播这些操作,重建原始数据集,使用与Redis协议本身相同的格式记录命令。…...
【八】Zookeeper3.7.1集成Hadoop3.3.4集群安装
文章目录 1.基本原理2.下载并解压ZooKeeper3.配置环境变量4.配置ZooKeeper5.创建数据目录并初始化myid6.启动ZooKeeper7.配置ZooKeeper集成到Hadoop8.重启Hadoop9.ZooKeeper状态检查 1.基本原理 ZooKeeper 是一个分布式协调服务,用于分布式系统中管理配置信息、命名…...
【C/C++笔记】:易错难点3 (二叉树)
选择题 🌈eg1 一棵有15个节点的完全二叉树和一棵同样有15个节点的普通二叉树,叶子节点的个数最多会差多少个()? 正确答案: C A. 3 B. 5 C. 7 D. 9 解析:普通二叉树的叶子节…...
一篇文章解决Webpack
一:什么是webpack webpack是一个用于现代JavaScript应用程序的静态模块打包工具。本质是一个软件包, 静态模块包括以下:html、css、js、图片等固定内容的文件 二:webpack工作原理 当 webpack 处理应用程序时,它会在内…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
