c++中如何使用multimap_c++支持重复键的关联容器用法【汇总】
发布时间 - 2026-01-23 00:00:00 点击率:次multimap是C++中唯一原生支持重复键的有序关联容器,基于红黑树实现,允许insert相同key的多个值,禁用operator[],需用equal_range遍历匹配key的所有元素,erase(key)可一次性删除全部同key节点。
multimap 是 C++ 标准库中唯一原生支持重复键的有序关联容器,它不强制键唯一,但要求键值对按 key 严格弱序排列(默认升序),底层通常基于红黑树实现。
如何声明和插入重复键的元素
与 map 不同,multimap 允许调用 insert() 多次插入相同 key 的不同值,且不会覆盖或报错。注意不能用 operator[] —— 它在 multimap 中被禁用,因为下标访问语义与“多值”冲突。
- 必须使用
insert():支持std::pair、std::make_pair或花括号初始化 - 推荐用
emplace()避免临时对象拷贝(C++11 起) - 插入后容器自动按
key排序,相同key的多个值按插入顺序(稳定排序)相邻存放
std::multimapmm; mm.insert({1, "apple"}); mm.insert(std::make_pair(1, "banana")); // 同 key,合法 mm.emplace(2, "cherry"); // 更高效
如何遍历所有匹配 key 的元素
不能用 find() 直接取单个值——它只返回第一个匹配项的迭代器。要获取全部,必须用 equal_,它返回一个 
std::pair,表示 [first, last) 区间内所有 key 相等的元素。
-
equal_range(key)是最安全、最高效的批量查找方式 - 若 key 不存在,返回的两个迭代器相等,循环体不执行
- 不要混用
lower_bound()+upper_bound()手动计算范围,易出错且可读性差
auto range = mm.equal_range(1);
for (auto it = range.first; it != range.second; ++it) {
std::cout << it->first << ": " << it->second << "\n";
}
删除指定 key 的所有元素时要注意什么
erase(key) 会直接删除该 key 对应的所有节点,返回删除个数(size_t),这是最简洁的方式。但需警惕:若误用 erase(iterator) 只删一个,可能遗漏其余重复项。
- 用
mm.erase(1)删除所有key == 1的元素,一步到位 - 若只想删其中一个,先用
find()获取单个迭代器再erase(it) - 删除操作后,其他迭代器是否失效?—— 是的,被删节点的迭代器立即失效;未被删的仍有效(红黑树局部调整)
multimap 和 unordered_multimap 的关键区别
当性能成为瓶颈且不需要有序遍历时,应考虑 unordered_multimap:它用哈希表实现,平均 O(1) 插入/查找,但不保证任何顺序,且要求 key 类型提供 std::hash 和 operator==。
-
multimap:有序、稳定、支持lower_bound/upper_bound等范围操作 -
unordered_multimap:无序、更快、但无法做“小于某 key 的所有元素”这类查询 - 二者接口高度一致,替换成本低,但语义差异影响算法设计
真正容易被忽略的是:multimap 的“重复键”能力不是为替代数组而设的,它是为建模一对多关系(如学号→多门课程成绩)或需要按 key 分组检索的场景服务的。滥用会导致迭代开销陡增,尤其当某个 key 对应成百上千个 value 时,equal_range 返回的区间遍历本身就成了性能热点。
# app
# ai
# c++
# apple
# 热点
# 区别
# 键值对
# 排列
# 标准库
# red
# 循环
# 接口
# operator
# map
# 对象
# 算法
# 迭代
# 遍历
# 多个
# 红黑
# 不能用
# 的是
# 这是
# 升序
# 第一个
# 不需要
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在IIS管理器中快速创建并配置网站?
如何用PHP工具快速搭建高效网站?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel如何处理CORS跨域请求?(配置示例)
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
魔毅自助建站系统:模板定制与SEO优化一键生成指南
Laravel如何实现API资源集合?(Resource Collection教程)
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel API资源类怎么用_Laravel API Resource数据转换
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
Bootstrap整体框架之JavaScript插件架构
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
Laravel集合Collection怎么用_Laravel集合常用函数详解
如何在宝塔面板创建新站点?
如何在万网ECS上快速搭建专属网站?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
如何为不同团队 ID 动态生成多个“认领值班”按钮
Java垃圾回收器的方法和原理总结
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
太平洋网站制作公司,网络用语太平洋是什么意思?
EditPlus中的正则表达式 实战(4)
如何基于云服务器快速搭建个人网站?
详解阿里云nginx服务器多站点的配置
Java遍历集合的三种方式
如何用景安虚拟主机手机版绑定域名建站?
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
Laravel如何处理表单验证?(Requests代码示例)
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
使用豆包 AI 辅助进行简单网页 HTML 结构设计
如何在阿里云虚拟服务器快速搭建网站?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何在阿里云服务器自主搭建网站?
如何选择可靠的免备案建站服务器?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
详解Android——蓝牙技术 带你实现终端间数据传输
佛山网站制作系统,佛山企业变更地址网上办理步骤?
上一篇:vscode怎么调试ts
下一篇:vscode用不了了怎么办
上一篇:vscode怎么调试ts
下一篇:vscode用不了了怎么办

