【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、电源线、两…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
