【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、电源线、两…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
