【C++】map详解(键值对的概念,与multimap的不同)
目录
00.引言
set 和 map 的区别
键值对的概念
01.map容器
主要特性
常用操作
主要用途
02.multimap容器
特性
常用操作
用途
00.引言
set 和 map 的区别
set 和 map 都是C++标准模板库(STL)中的容器,它们的区别如下:
-
set是一个集合容器,存储的是唯一的元素,元素本身就是它的值,且元素按照某种顺序进行存储。set不允许存储重复元素,常用于去重场景。 -
map是一种键值对容器,存储的是成对的数据(key-value pairs),其中键(key)是唯一的,值(value)可以重复。map主要用于通过键快速访问对应的值。
键值对的概念
键值对(Key-Value Pair)是指一种数据结构,其中每个数据项都由两个部分组成:键(key)和值(value)。键是唯一的,通过键可以快速找到对应的值。键值对的应用广泛,特别是在映射、查找、统计和数据关联等场景中。
键值对的特性
键是唯一的:在键值对中,每个键都是唯一的,不能有重复的键。
值可以重复:虽然键是唯一的,但对应的值可以重复,即多个键可以映射到相同的值。
例如,在 map 容器中:
map<string, int> myMap;
myMap["apple"] = 10; // "apple" 是键,10 是值
myMap["banana"] = 20;
myMap["apple"] = 20; // 值可以被修改,也可以重复
01.map容器
map 是一种存储键值对的关联容器,底层通过红黑树实现,元素按照键进行排序,其提供了高效的插入、删除和查找操作。
主要特性
-
键值对存储:每个元素由一个键和一个值组成,键通过某种排序规则存储,且键是唯一的。
-
自动排序:
map中的元素默认按照键的升序排序。可以使用自定义比较函数改变排序方式。 -
查找效率:
map使用红黑树(平衡二叉搜索树)作为底层结构,查找、插入和删除操作的时间复杂度为 O(log n)。
常用操作
1.插入元素:通过下标运算符 [] 或 insert 方法插入键值对:
map<string, int> myMap;
myMap["apple"] = 10; // 插入键为 "apple",值为 10 的键值对
myMap.insert(make_pair("banana", 20)); // 使用 insert 插入键值对
要明白下标运算符 [] 是如何完成插入操作的,就要了解其底层逻辑,下图是官方的说明:
具体的说,如果 myMap[ k ] 此时元素k的键已存在,就会返回其对应的值的引用,既可以查看也可以修改;如果元素k的键不存在,则会插入一个元素k的新键,也会返回对应值的引用(默认为0)
2.查找元素:使用 find 方法查找键对应的值,返回指向键值对的迭代器,如果找不到对应的键,那么会返回一个指向 map 末尾的迭代器 map.end():
auto it = myMap.find("apple");
if (it != myMap.end()) {cout << it->first << ": " << it->second << endl;
}
3.删除元素:使用 erase 方法删除指定键的元素:
myMap.erase("apple");
4.遍历元素:可以通过迭代器遍历 map 中的所有键值对:
for (const auto& pair : myMap) {std::cout << pair.first << ": " << pair.second << std::endl;
}
主要用途
1.关联数组:将一个键映射到一个值,常用于模拟字典或关联数组。
2.统计频率:可以用来统计元素出现的次数,如统计单词的出现频率。
3.数据映射:适合用于需要快速查找键值对应关系的场景,比如用户 ID 与姓名的映射。
02.multimap容器
在 C++ 标准模板库(STL)中,map 和 multimap 存储的是键值对(key-value pairs),但它们之间有显著的区别:
键的唯一性:
map:键是唯一的,每个键只能对应一个值。如果插入一个已经存在的键,新值会替换旧值
multimap:允许键重复,即同一个键可以对应多个值。它适用于需要存储相同键的多个值的场景。
特性
multimap 适合用于存储一对多关系的数据。
键可重复:multimap 中的键不必唯一,同一个键可以对应多个值。
自动排序:multimap 和 map 一样,键默认是按升序自动排序的。
查找效率:和 map 一样,multimap 的查找、插入、删除操作的时间复杂度都是 O(log n)。
常用操作
1.插入操作:使用 insert 方法插入键值对,支持同一个键插入多个不同的值。
multimap<string, int> myMultimap;
myMultimap.insert(make_pair("apple", 10));
myMultimap.insert(make_pair("apple", 20)); // 允许相同键插入
注意:multimap 不能 使用 [] 运算符进行插入或访问。
这是因为 multimap 允许键重复,而 [] 运算符需要确保键是唯一的。[] 在 map 中的行为是根据键查找对应的值,如果键不存在就插入一个新的键值对并返回引用,这种行为与 multimap 的多键特点冲突。
2.查找元素:
a. 使用 find 查找第一个匹配的键。
b. 使用 equal_range 方法查找某个键对应的所有值,返回一个范围(pair of iterators)。
auto range = myMultimap.equal_range("apple");
for (auto it = range.first; it != range.second; ++it) {cout << it->first << ": " << it->second << endl;
}
3.删除元素:使用 erase 方法删除某个键的所有值或单个键值对
删除所有键值对:
myMultimap.erase("apple"); // 删除所有 "apple" 的键值对
删除单个键值对:通过迭代器遍历删除
auto it = myMultimap.find("apple");for (; it != myMultimap.end(); ++it) {if (it->second == 20) {myMultimap.erase(it); // 通过迭代器删除该键值对break;}}
或者:通过范围迭代删除特定键值对
// 获取 "apple" 键的范围auto range = myMultimap.equal_range("apple");// 在范围内查找并删除值为 20 的键值对for (auto it = range.first; it != range.second; ++it) {if (it->second == 20) {myMultimap.erase(it); // 通过迭代器删除break;}}
4.遍历元素:可以像遍历 map 一样遍历 multimap 中的所有键值对。
for (const auto& pair : myMultimap) {std::cout << pair.first << ": " << pair.second << std::endl;
}
用途
1.一对多映射:multimap 适合用于一对多的映射关系,比如在存储课程和学生名单时,一个课程可以有多个学生。
2.多重计数:当需要统计多个相同键对应不同值的情况时,multimap 是一种便捷的工具。
以上就是map和multimap的相关知识总结,欢迎在评论区留言,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉
相关文章:
【C++】map详解(键值对的概念,与multimap的不同)
目录 00.引言 set 和 map 的区别 键值对的概念 01.map容器 主要特性 常用操作 主要用途 02.multimap容器 特性 常用操作 用途 00.引言 set 和 map 的区别 set 和 map 都是C标准模板库(STL)中的容器,它们的区别如下:…...
私域电商新纪元:消费增值模式引领百万业绩飞跃
各位朋友,我是吴军,专注于带领大家深入探索私域电商领域的非凡魅力与潜在机会。 今天,我想与大家分享一个鼓舞人心的真实故事。在短短的一个月内,我们的合作伙伴实现了业绩的飞跃,突破百万大关,并且用户活跃…...
AAA Mysql与redis的主从复制原理
一 :Mysql主从复制 重要的两个日志文件:bin log 和 relay log bin log:二进制日志(binnary log)以事件形式记录了对MySQL数据库执行更改的所有操作。 relay log:用来保存从节点I/O线程接受的bin log日志…...
结合大语言模型的机械臂抓取操作学习
一、 大语言模型的机械臂抓取操作关键步骤 介绍如何基于大语言模型实现机械臂在PyBullet环境中的抓取操作,涵盖机器人运动学、坐标系转换、抓取候选位姿生成、开放词汇检测以及大语言模型代码生成等模块。 1. 机器人正逆运动学基本概念 正运动学: 已知机器人的关节…...
数据结构-二叉树_堆
一. 树的概念 树在我们的日常生活中随处可见,人们将生活中的树转换成存放数据的树形结构,就成了数据结构中的“树”。 如上图所示,自然界中的树有树根,有树枝,有树叶,当我们将其转换成树形结构时…...
Vscode+Pycharm+Vue.js+WEUI+django火锅(三)理解Vue
新创建的Vue项目里面很多文件,对于新手,老老实实做一下了解。 1.框架逻辑 框架的逻辑都是相通的,花点时间理一下就清晰了。 2.文件目录及文件 创建好的vue项目下,主要的文件和文件夹要先认识一下,并与框架逻辑对应起…...
溯变:守护天使 | OPENAIGC开发者大赛企业组优秀作品
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...
android中byte[] buf没有结束符,new String(buf)会不会出错?
答案是:不会 看例子: 这和c是不一样的,不需要特别的在字符串后面添加一个\0结束....
鸿蒙harmonyos next flutter混合开发之开发plugin(获取操作系统版本号)
创建Plugin为my_plugin flutter create --org com.example --templateplugin --platformsandroid,ios,ohos my_plugin 创建Application为my_application flutter create --org com.example my_application flutter_application引用flutter_plugin,在pubspec.yam…...
介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
首先附上大神的开源地址(自行克隆吧): https://github.com/Wanderson-Magalhaes/Modern_GUI_PyDracula_PySide6_or_PyQt6 步骤一:安装PySide6库 pip install PySide6 步骤二:运行main文件 python main.py 就得…...
【大模型】AI数据基础设施的对象存储
官网地址: MinIO | S3 Compatible Storage for AI Github地址: https://github.com/minio/minio 企业级,并对AI准备就绪的分布式对象存储(一般拿来存模型文件) 部署步骤参考: minio安装部署及…...
【前端工程解耦】使用事件中心实现系统解耦,注册,触发,删除事件
前言 事件中心提供了一种灵活且可扩展的方式来管理事件和处理函数之间的关系,同时保持它们之间的解耦,可以降低系统耦合度,将视图和逻辑拆分出来,还是那句话,如果一个中间件解决不了问题,那就再加一个 废话…...
计算机网络803-(4)网络层
目录 1.虚电路服务 虚电路是逻辑连接 2.数据报服务 3.虚电路服务与数据报服务的对比 二.虚拟互连网络-IP网 1.网络通信问题 2.中间设备 3.网络互连使用路由器 三.分类的 IP 地址 1. IP 地址及其表示方法 2.IP 地址的编址方法 3.分类 IP 地址 (1&#x…...
java速成指南
密码都是 123 适用于php .net 7天转java 【腾讯文档】快速上手培训-阿龙 分享给你多个文件 https://docs.qq.com/s/jUcRQ4VPA4grzx8SPYzrBa 第一节 安装jdk,maven,idea_哔哩哔哩_bilibili...
【Unity】双摄像机叠加渲染
一、前言 之前我在做我的一个Unity项目的时候,需要绘制场景网格的功能,于是就用到了UnityEngine.GL这个图形库来绘制,然后我发现绘制的网格线是渲染在UI之后的,也就是说绘制出来的图形会遮盖在UI上面,也就导致一旦这些…...
web网页项目--用户登录,注册页面代码
index.html <!DOCTYPE html> <html lang"zxx"><head><title>xxx注册</title><!-- Meta tags --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…...
国外火出圈儿的PM御用AI编程工具Bolt.new效果干不过国产的CodeFlying?号称全新定义全栈开发流程?
不知道大家最近有没有发现国外的很多AI都在挤破脑袋想去提升大模型的编程能力, 离我们最近的是上周Openai 发布的全新模型GPT-4o-Canvas, 拥有超强的代码编写能力。 另外还有LlamaCoder、Cursor、Claude artifacts、Replit... 光是今年一年就推出了好…...
爸妈总说着学门技术,学机器视觉技术确实是一条踏实的生活道路,这条路你走得下去走得通吗?
你爸妈说的对,有一技之长终身受益,人要有一技傍身。学一门技术是稳定职业与生活的基本的保障,但是与其盲目的选择一门技术,都是成年人,不如思考下这门技术给自我带来经济效益,在这一方面可以详细咨询我。 …...
2024互联网下载神器IDM6.42你值得拥有
🔥 互联网下载神器大揭秘!IDM6.42你值得拥有 🚀 Hey,各位小伙伴们,今天我要给你们安利一款我超爱的软件——Internet Download Manager 6.42(简称IDM),这款下载器简直就是下载界的“…...
基于H3C环境的实验——OSPF
目录 实验设备和环境 实验设备 实验环境 实验记录 1、单区域 OSPF基本配置 步骤1:搭建实验环境并完成基本配置 步骤2:检查网络连通性和路由器路由表。 步骤3:配置OSPF 步骤4:检查路由器OSPF邻居状态及路由表 实验设备和环境 实验设备 三台路由器、两台PC、电源线、两…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
