9、STL中的multimap使用方法
一、了解
multimap
是一个允许键(key)重复的关联容器。适合用于一对多的更新。 允许多个键拥有相同的值。基于红黑树
。
- multimap特性
- 键允许重复:允许多个键有相同的值。
- 无 [ ] 运算法:禁止用 下标访问,因为键不唯一。
- 排序:默认升序规则,可以自定义。
- 性能:基于红黑树的实现。
- 时间复杂度:插入 / 删除 / 查找是O(logn)
- 不支持直接修改键:键是排序好的。直接修改会改变顺序。如果要修改,先删除要修改的键,再插入新元素。
常见问题
1、如何在 multimap中搜索一个特定键对应的所哟值?
- 使用
equal_range
获得一个迭代器,他包含给定键的第一个元素和超过最后一个元素的迭代器。遍历这个范围来找到相对应的值。2、如何从 multimap 中删除一个特定的键值对?
- 使用
erase
找到特定的键值对。键是排序好的。直接修改会改变顺序。如果要修改,先删除要修改的键,再插入新元素3、在 multimap 中插入数据有什么特别之处?
- 不需要检查键是否已经存在。由于 multimap 允许键的重复,插入操作会简单地添加一个新的键值对到容器中,即使该键已经有一个或多个关联值。您可以使用 insert 执行插入操作。
4、multimap 是如何保证元素顺序的?
- 使用平衡二叉树红黑树来存储元素。
- 使用的头文件
#include < map >
二、初始化
multimap<KeyType, ValueType> myMap;
键类型 KeyType:必须支持 < 运算符,或传入自定义比较函数。
值类型 ValueType:任意类型(包括自定义类型)。
int main(){pair<int,int>pair1={1,2};pair<int,int>pair2=make_pair(1,2);multimap<int ,int>multimap1={{1,2},{1,2}};multimap<int ,int>multimap2={pair1,pair2};multimap<int ,int>multimap3(multimap2);multimap<int ,int>multimap4=multimap3;multimap<int ,int>multimap5{pair<int,int>(1,2)};
}
- 自定义排序
// 自定义键类型的比较规则(假设 Key 是结构体)
struct Key { int id; };
struct Compare {bool operator()(const Key& a, const Key& b) const {return a.id < b.id;}
};
multimap<Key, string, Compare> customMultimap;
三、常见使用函数
1、总结
2、例子
- 首先是这里用到的头文件
#include<iostream>
#include<map>
#include<utility>
using namespace std;
2.1、插入操作
- insert(key-value)
- 插入一个键值对
int main(){multimap<int,int>m;m.insert(pair<int,int>(1,2));for(auto i:m){cout<<"first:"<<i.first<<" "<<"second:"<<i.second<<endl;//first:1 second:2}
}
- insert(first , end )
- 插入另一个multimap的范围
int main(){multimap<int,int>m;multimap<int,int>multimap1={{2,3},{1,2}};m.insert(multimap1.begin(),multimap1.end());for(auto i:m){cout<<"first:"<<i.first<<" "<<"second:"<<i.second<<endl;/*first:1 second:2first:2 second:3*/}}
- insert({初始化列表})
- 插入初始化列表
int main(){multimap<int,int>m;multimap<int,int>multimap1={{2,3},{1,2}};m.insert({{1,2},{2,3}});for(auto i:m){cout<<"first:"<<i.first<<" "<<"second:"<<i.second<<endl;/*first:1 second:2first:2 second:3*/}
}
- insert(pos , {初始化列表})
- 插入初始化列表值
int main(){multimap<int,int>m;m.insert(m.begin(),{1,2});for(auto i:m){cout<<"first:"<<i.first<<" "<<"second:"<<i.second<<endl;/*first:1 second:2*/}
}
2.2、删除操作
- erase(key)
- 删除key的节点
int main(){multimap<int,int>m={{1,2},{2,3}};m.erase(1);for(auto i:m){cout<<"first:"<<i.first<<" "<<"second:"<<i.second<<endl;/*first:2 second:3*/}
}
- erase(first ,end )
- 删除范围内的multimap
int main(){multimap<int,int>m={{1,2},{2,3}};m.erase(m.begin(),m.end());for(auto i:m){cout<<"first:"<<i.first<<" "<<"second:"<<i.second<<endl;//}
}
- erase(pos )
- 删除pos位置的节点
int main(){multimap<int,int>m={{1,2},{2,3}};m.erase(m.begin());for(auto i:m){cout<<"first:"<<i.first<<" "<<"second:"<<i.second<<endl;//first:2 second:3}
}
2.4、查询操作
int main(){multimap<int,int>m={{1,2},{2,3},{2,4}};auto j = m.equal_range(2);auto start = j.first;auto end = j.second;for(multimap<int,int>::iterator it=start;it!=end;it++){cout<<"first:"<<it->first<<" "<<"second:"<<it->second<<endl;//first:2 second:3//first:2 second:4}
}
- find(key)
- 返回找到的第一个位置的迭代器
int main(){multimap<int,int>m={{1,2},{2,3},{2,4}};auto i = m.find(2);cout<<i->first<<" "<<i->second;// 2 3
}
- count(key)
- 计数这个key有多少个
int main(){multimap<int,int>m={{1,2},{2,3},{2,4}};auto i = m.count(2);cout<<i;//2
}
2.5、容量操作
- size()
- 当前元素数量
int main(){multimap<int,int>m={{1,2},{2,3},{2,4}};int num = m.size();cout<<num<<endl;//3
}
- empty()
- 当前multimap是否为空
int main(){multimap<int,int>m={{1,2},{2,3},{2,4}};if(m.empty()==1){cout<<"m是空的"<<endl;}else{cout<<"m不是空的"<<endl;}//m不是空的
}
2.6、交换操作
- swap(other_multimap)
- 交换2个multimap
int main(){multimap<int,int>m1={{1,2},{2,3},{2,4}};multimap<int,int>m2={{2,3}};m1.swap(m2);auto i = m1.begin();cout<<"second :"<<i->second<<endl;cout<<"first : "<<i->first;//second :3//first : 2
}
2.7、访问操作
- 迭代器访问
- 迭代器访问。存在双向迭代器
- 一般用正向迭代器就够用了。
int main(){multimap<int,int>m={{1,2},{2,3},{2,4}};auto i = m.begin();auto j =m.end();cout<<"begin :"<<i->first<<endl;cout<<"end: "<<j->first;//begin :1//end: 3
}
2.8、lower_bound(key)
- lower_bound(key)
- 返回第一个比大于等于(>=)key的迭代器
int main(){multimap<int,int>m={{1,2},{2,3},{2,4}};auto i = m.lower_bound(1);cout<<i->first<<" "<<i->second;//1 2
}
2.9、upper_bound(key)
- upper_bound(key)
- 返回第一个大于(>) key的迭代器
int main(){multimap<int,int>m={{1,2},{2,3},{2,4}};auto i = m.upper_bound(1);cout<<i->first<<" "<<i->second;//2 3
}
相关文章:
9、STL中的multimap使用方法
一、了解 multimap是一个允许键(key)重复的关联容器。适合用于一对多的更新。 允许多个键拥有相同的值。基于红黑树。 multimap特性 键允许重复:允许多个键有相同的值。无 [ ] 运算法:禁止用 下标访问,因为键不唯一。…...
keepalived的工作原理和脑裂
一、Keepalived工作原理 keepalived是一个用于实现高可用和负载均衡的服务,主要基于虚拟路由协议,解决了nginx一台机器的单点故障问题。通过将两台nginx都配置keepalived,让两天nginx互为主机和备机;且keepalived通过 VRRP 协议和…...
k8s资源管理介绍
1.命令式管理常见的命令 资源管理方式 kubectl get nodes查看集群 kubectl get pods 查看所有pod kubectl get pod pod名 -o yaml 以yaml形式查看某个pod kubectl create namespace dev创建一个dev组 Namespace 是 Kubernetes 中用于隔离资源的一种机制。通过 Namespace&a…...
激光slam学习笔记10---ubuntu2004部署运行fastlivo2踩坑记录
背景:mars实验室又发福利啦!跑跑效果,验了那句,mars出品,必属精品!本人pc环境ubuntu20.04,基本流程按照readme走就行,sophus和vikit安装有些注意地方。本文做了一些部署踩坑记录&…...
Windows11 新机开荒(二)电脑优化设置
目录 前言: 一、注册微软账号绑定权益 二、此电脑 桌面图标 三、系统分盘及默认存储位置更改 3.1 系统分盘 3.2 默认存储位置更改 四、精简任务栏 总结: 前言: 本文承接上一篇 新机开荒(一) 上一篇文章地址&…...
一次模拟Windows挖矿病毒应急响应的流程及思路
什么是挖矿病毒? 挖矿病毒并非传统意义上专门用于破坏计算机系统的病毒,它本质是为了获取虚拟货币收益而非法侵占用户计算资源的恶意程序。这些虚拟货币如比特币、以太坊等,其获取过程依赖计算机的算力进行复杂运算,挖矿病毒正是…...
51单片机的寻址方式(完整)
目录 一、立即数寻址 二、直接寻址 三、寄存器寻址 四、寄存器间接寻址 五、变址寻址 六、位寻址 七、指令寻址 (一)绝对寻址 (二)相对寻址 在 51 单片机中,寻址方式是指在执行指令时,CPU 寻找操作…...
深入理解 Linux 的 top 命令:实时监控系统性能
在 Linux 系统管理和性能优化中,top 命令是一个不可或缺的工具。它可以实时显示系统的进程信息和资源使用情况,帮助管理员快速定位性能瓶颈。本文将详细介绍 top 命令的输出内容及其使用方法,帮助你更好地掌握系统性能监控。 一、top 命令简介 top 是一个动态显示系统状态的…...
Excel(函数篇):IF函数、FREQUNCY函数、截取函数、文本处理函数、日期函数、常用函数详解
目录 IF函数等于判断区间判断与AND函数、OR函数一同使用IFNA函数和IFERROR函数 FREQUNCY函数、分断统计LEFT、RIGHT、MID截取函数FIND函数、LEN函数SUBSTITUTE函数ASC函数、WIDECHAR函数实战:如何获取到表中所有工作簿名称文本处理函数TEXT函数TEXTJOIN函数 日期函数…...
基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)
1. 前言 在数据分析和网络爬虫的应用场景中,我们经常需要获取社交媒体平台的数据,例如 TikTok。本篇文章介绍如何使用 Python 爬取 TikTok 用户搜索数据,并解析其返回的数据。 结果截图 2. 项目环境准备 在正式运行代码之前,我…...
本专栏开栏通知相关申明
通知 本专栏主要介绍本人C开发过程中遇到的各种技术栈问题,开此栏用于整合自己所学习到的所有知识点,现在无偿分享给大伙。大伙有好的建议或者问题可以在评论直接留言,我不一定有时间看到,但是看到会回复的。 技术栈1 截止到202…...
数据库设计实验(3)—— 分离与附加、还原与备份
一、目的与要求 掌握SQL Server2012拷贝物理文件的方法;掌握SQL Server 2012附加数据库的方法;掌握SQL Server 2012备份和还原的方法;掌握SQL Server 2012定期自动备份的方法。开始简单的SQL查询 二、实验准备 了解数据库分离和附加的意义&…...
Swift 并发中的任务让步(Yielding)和防抖(Debouncing)
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
hibernate 自动生成数据库表和java类 字段顺序不一致 这导致添加数据库数据时 异常
hibernate 自动生成的数据库表和java类 字段顺序不一致 这导致该书写方式添加数据库数据时 异常 User user new User( null, username, email, phone, passwordEncoder.encode(password) ); return userRepository.save(user);Hibernate 默认不会保证数据库表字段的顺序与 Ja…...
05 MP4解码AAC + 格式知识
AAC⾳频格式ADIF这种格式的特征是可以确定的找到这个⾳频数据的开始,不需进⾏在⾳频数据流中间开始的解码,即它的解码必须在明确定义的开始处进⾏。故这种格式常⽤在磁盘⽂件中 ADTS是AAC⾳频的传输流格式。AAC⾳频格式在MPEG-2(ISO-13318-7 2003)中有定义。AAC后来⼜被采⽤…...
docker和k8s区别详解
一、核心定位对比 维度DockerKubernetes (K8s)引用来源核心功能容器引擎(构建、运行、分发容器)容器集群管理系统(编排、调度、扩展)[1][2][5]抽象层级单机容器化技术跨主机集群管理平台[5][6]技术目标解决应用环境一致性解决大规…...
生信分析服务作图TCGA/GEO数据库挖掘细胞测序转录学代做指导辅导
生信分析服务作图、TCGA/GEO数据库挖掘、细胞测序转录学代做指导辅导等相关内容,是当前生命科学研究中不可或缺的一部分。以下是对这些服务的详细解析: 一、生信分析服务作图 生信分析服务作图是生信分析中的重要环节,它通过将复杂的生物信…...
修改HuggingFace模型默认缓存路径
huggingface模型的默认缓存路径是~/.cache/huggingface/hub/ 通常修改为自己的路径会更为方便。 方式一:cache_dir 参数 可以通过from_pretrained函数中的 cache_dir 参数来指定,缺点,每次都需要手动指定,比较麻烦。 如&#x…...
游戏引擎学习第167天
回顾和今天的计划 我们不使用引擎,也不依赖库,只有我们自己和我们的小手指在敲击代码。 今天我们会继续进行一些工作。首先,我们会清理昨天留下的一些问题,这些问题我们当时没有深入探讨。除了这些,我觉得我们在资产…...
阿里云服务器环境部署 三 Minio文件服务集群的搭建
Minio文件服务集群的搭建 一 准备工作 1、三台机器 配置 vim /etc/hosts 172.16.108.44 minio4 172.16.108.43 minio3 172.16.108.42 minio2 [rootbigdata41 es]# docker --version Docker version 26.1.4, build 5650f9b [rootbigdata43 minio]# docker-compose -v -bash…...
让人感到疑惑的const
const 关键字在不同的编程语言中有着不同的含义和限制,但通常它被用来声明一个常量或只读变量。然而,在 JavaScript 中,const 的行为有时可能会让人感到困惑,因为它并不总是意味着“不可变”(immutable)。让…...
网易云信架构升级实践,故障恢复时间缩至8秒
一、项目背景 网易云信是网易旗下集IM与音视频技术于一体的PaaS服务平台,为全球提供融合通信与视频的核心功能和组件,包括IM即时通讯、短信、信令等通信服务,以及RTC、直播、点播、互动直播、互动白板等音视频服务,此外…...
算法刷题记录——LeetCode篇(3) [第201~300题](持续更新)
(优先整理热门100及面试150,不定期持续更新,欢迎关注) 207. 课程表 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequ…...
navicat导出文件密码解密
文章目录 一、概念二、导出文件1、创建的数据库连接信息2、导出带密码的连接信息3、查看导出后的文件 三、Python代码解析四、参考地址 一、概念 Navicat中导出的带密码的文件后缀是.ncx结尾的,里面是xml格式的文件,存储了数据库的连接,方便…...
uniapp vue3项目定义全局变量,切换底部babar时根据条件刷新页面
前言 uniapp项目中,每个tabbar页面来回点时候,不会触发页面更新。但是有时页面上有数据发生改变需要更新模版时,就得能及时的通知到页面。如果在onshow生命周期里每次都调用异步请求更新数据,有些不合理,况且页面有时…...
Linux上的`i2c-tools`工具集的详细介绍;并利用它操作IMX6ULL的I2C控制器进而控制芯片AP3216C读取光照值和距离值
IC-Tools 工具集介绍 i2c-tools 是 Linux 下用于 IC 设备调试 的用户空间工具集(你也可以把它看成是一个库,类似于之前自己用过的触摸屏库tslib库、FreeType矢量字符库),它提供了一系列命令行工具,可以扫描、读取、写入 IC 设备,…...
## DeepSeek写射击手机小游戏
DeepSeek写射击手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端射击小游戏H5文件: 要求 可以重新开始游戏 可以暂停游戏 射击位置在底部中间ÿ…...
奇安信全流量(天眼)面试题
一、全流量设备(天眼)的部署架构 天眼系统采用旁路部署模式,通过流量镜像实现非侵入式监测,核心组件包括流量传感器、分析平台和文件威胁鉴定器,具体部署架构如下: 传感器部署 关键节点覆盖:在…...
计算机四级 - 数据库原理(操作系统部分)- 第2章「操作系统运行机制」
系统调用是应用程序请求操作系统核心完成某一特定功能的一种过程调用,与一般调用的最大区别就是调用程序运行在用户态,而被调用程序则运行在系统态寄存器类型: 用户不可见寄存器:程序计数器、指令寄存器、程序状态字(P…...
【css酷炫效果】纯CSS实现虫洞穿越效果
【css酷炫效果】纯CSS实现穿越效果 缘创作背景html结构css样式完整代码基础版进阶版(虫洞穿越) 效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90491973 缘 创作随缘,不定时…...
火山引擎(豆包大模型)(抖音平台)之火山方舟的Prompt的使用测试
前言 在大模型的使用过程当中,Prompt的使用非常的关键。原来,我对Prompt的理解不深,觉得Prompt的产生并不是很有必要。但是,自从使用了火山方舟中的“Prompt优解”之后,感受加深了,觉得Prompt是我们和大模型…...
多线程(四)----线程安全
线程安全问题的万恶之源就是多线程的抢占式执行所带来的随机性. 有了多线程, 此时抢占式执行下, 代码执行的顺序, 会出现更多的变数, 代码执行顺序的可能性就从一种情况变成了无数种情况. 只要有一种情况使得代码结果不正确, 都是视为bug, 线程不安全. 有线程安全的代码 以下…...
跨系统投屏:Realme手机(远程)投屏到Linux系统的简单方法
家里长辈年纪上来了,有点老花眼,平常看手机总是觉得字体不够大,还一个劲儿地将手机拿很远。其实那台手机的字体已经调到最大了。 为了让长辈刷手机的时候可以轻松快乐一点,我们帮他将手机投屏到电脑上。毕竟电脑屏幕比手机大多了&…...
【eNSP基础使用教程-1】
座右铭: 纵有疾风起,人生不言弃。 文章目录 前言一、更改设备名称指令1、双击路由器进入2、 进入系统视图3、更改设备名称为R14、使用同样的办法修改路由器R2、R3 二、配置路由物理接口的IP 地址1、查看R1路由器当前接口IP 地址配置与路由表2、查看路由器上的路由表…...
android开发:组件事件汇总
在 Android 开发中,Java 文件中有许多组件事件可以处理用户交互。以下是一些常见的组件事件及其用途和示例: 1. 点击事件 (Click) 用于处理用户点击控件的操作。 示例代码: Button button findViewById(R.id.button); button.setOnClickL…...
C++|向函数传递对象
在 C 里,对象作为函数的参数和返回值,有值传递、指针传递和引用传递这三种传递方式,下面为你详细介绍。 1.值传递 在值传递时,把实参对象的值复制给形参对象,函数会接收实参的一个副本,而非实参本身。函数…...
网络爬虫【爬虫库urllib】
我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 urllib介绍 Urllib是Python自带的标准库,无须安装,直接引用即可。 Urllib是一个收集几个模块来使用URL的软件包,大致具备以下功能。 ● urlli…...
【一起来学kubernetes】17、Configmap使用详解
前言概述核心特性创建 ConfigMap使用 ConfigMap1. **环境变量**2. **Volume 挂载**3. **命令行参数** 更新与热重载Docker容器中Java服务使用Configmap**一、通过环境变量注入****步骤说明****示例配置** **二、通过 Volume 挂载配置文件****步骤说明****示例配置** **三、动态…...
QT程序双击可执行文件运行方法
1、qt编译选择release模式 在pro文件添加:QMAKE_LFLAGS -no-pie 2、cmake编译qt界面程序 在CMakeLists.txt文件中添加: set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -no-pie") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -no-pie")注意 …...
【css酷炫效果】实现鱼群游动动态效果
【css酷炫效果】实现小鱼游动动态效果 缘创作背景css代码创建div容器引入jquery引入鱼群js完整代码效果图成品资源下载链接:点击下载 缘 在开发系统功能的时候,无意间看到了小鱼游动特效,感觉很有意思,就在网上找了相关教程,分享给大家。 创作背景 刚看到csdn出活动了…...
【GNN】GAT
消息传递 层数越多,聚合更多的消息...
Prims region.Views 为null
原因: 导航未完成或异步问题 解决方式:使用回调确认导航完成后再操作视图 _regionManager.RequestNavigate("MonitorRegion", "MonitorView", nps, navigationResult > {if (navigationResult.Result true){var region _regio…...
在windows10系统上安装docker,然后在容器中运行GPU版本的Pytorch,并使用vscode连接该容器
一 . 安装Docker Desktop 首先打开网址https://docs.docker.com/desktop/install/windows-install/ 下载完后,双击下面的exe文件进行安装,默认情况下,Docker Desktop 安装在C:\Program Files\Docker\Docker 出现提示时,请确保…...
WPS 搭配 Zotero 插件使用
安装Zotero后,Word自动引入了插件,但WPS却没有,做为WPS的重度用户,这是不行的。 解决方案: 1.找到 Zotero.dotm 一般在安装目录下, 2.然后复制到WPS的startup下 我的目录是:C:\Users\lianq…...
卷积神经网络 - 卷积层(具体例子)
为了更一步学习卷积神经网络之卷积层,本文我们来通过几个个例子来加深理解。 一、灰度图像和彩色图像的关于特征映射的例子 下面我们通过2个例子来形象说明卷积层中“特征映射”的概念,一个针对灰度图像,一个针对彩色图像。 例子 1&#x…...
新造车不再比拼排名,恰是曲终人散时,剩者为王
据称新能源汽车周销量不再发布,这可能也预示着新造车终于到了给出答案的时候了,新造车企业前三强已基本确立,其余那些落后的车企已很难有突围的机会,而特斯拉无疑是其中的最大赢家。 3月份第一周的数据显示,销量最高的…...
学有所得-Deepin linux操作系统在安装nvidia显卡驱动后的问题修复
目标: 装有deepin V20.9的移动硬盘在系统启动后无法进入图形化界面,修复系统。 背景: 为了方便随时随地开发研究,又不破坏笔记本电脑原装的正版操作系统,在一个朗科(容量50&…...
【QT:网络编程】
网络编程的本质就是在编写应用层代码。需要传输层支持。而传输层的协议有UDP、TCP等 使用QT网络编程的API,需要在.pro文件中添加network模块,而QT中的控件和其他内容都是包含在QtCore模块中的(默认添加) QT为什么要划分模块&…...
基于srpingboot高校智慧校园教学管理服务平台的设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
分布式事务3PC解决了2PC哪些问题?
三阶段提交(3PC,Three-Phase Commit) 是对 二阶段提交(2PC,Two-Phase Commit) 的改进,旨在解决 2PC 的一些固有缺陷,特别是在分布式系统中的容错性和性能问题。以下是 3PC 比 2PC 更好的原因及其优势的详细分析: 1. 二阶段提交(2PC)的问题 2PC 是一种经典的分布式事…...