0

0

C++中multimap怎么存储重复键值对_C++标准库关联容器用法【进阶】

冰火之心

冰火之心

发布时间:2026-02-09 05:11:35

|

819人浏览过

|

来源于php中文网

原创

multimap允许重复键且按key排序而非插入顺序;find只返回首个匹配项,需equal_range获取全部;底层红黑树依赖严格弱序,浮点作key需谨慎;等价键插入时新元素置于末尾,保证同key内插入顺序。

c++中multimap怎么存储重复键值对_c++标准库关联容器用法【进阶】

multimap 允许重复键,但必须明确:它不按插入顺序保存,而是按 key 的 operator 排序;插入时不会覆盖,但查找、遍历需用 equal_range 或循环 find,否则只拿到第一个匹配项。

为什么 insertfind 只返回一个值?

multimap::find() 返回的是任意一个匹配的迭代器(通常是第一个),不是全部。它设计上就只负责“是否存在”,不负责“有多少个”。

  • 想取全部相同 key 的元素,必须用 equal_range(key),它返回 std::pair,左闭右开区间
  • 若只调 find 然后 ++,可能跳到下一个不同 key,中间漏掉同 key 的其他元素
  • count(key) 可快速知道重复数量,但不提供位置信息

multimap 的 key 类型必须支持严格弱序

map 一样,multimap 底层是红黑树,依赖 Compare 函数对象(默认 std::less)做排序和查找。这意味着:

  • 自定义结构体作 key 时,必须提供 operator,或传入自定义比较器,不能只重载 ==
  • 浮点数作 key 极其危险——0.1 + 0.2 != 0.3 会导致看似相同的 key 被当成不同键插入多次
  • 如果真要用浮点,建议转成整数倍(如乘 1000 后取整),或用 std::abs(a - b) 的比较器,但此时 equal_range 行为可能反直觉(因排序依据和相等判断依据不一致)

插入重复 key 时,新节点插入位置有讲究

multimap 保证等价键(!comp(a,b) && !comp(b,a))的插入顺序:新元素总插在已有等价元素的**末尾**(C++11 起稳定,符合“等价即不交换”语义)。

立即学习C++免费学习笔记(深入)”;

  • 这使得用 equal_range 遍历时,同一 key 的多个 value 按插入先后排列
  • 但注意:这个“先后”仅对同一 key 有效;不同 key 之间仍按排序规则穿插,不是 FIFO 队列
  • 若需要全局插入顺序 + 快速按 key 查找,multimap 不够用,得搭配 std::vector 或用 std::unordered_multimap(哈希无序,但插入顺序不保)

别把 multimap 当成万能去重替代品

有人想用 multimap> 存多份指针来“模拟引用计数”,这是错的——multimap 管理的是键值对的生命周期,不是 value 所指对象。

  • erase(iterator) 只销毁那个键值对,不影响其他同 key 的 pair,也不影响 shared_ptr 指向的对象是否被释放
  • 若 value 是裸指针,更危险:多个 key 对应同一地址,erase 一个后其余变成悬垂指针
  • 真正需要“一写多读+自动管理”的场景,该用 std::shared_ptr + 单独容器(如 std::map>),而不是靠 multimap 的重复性

最常被忽略的一点:当你改了 key 的比较逻辑(比如换了比较器),所有已存元素会按新规则重新解释顺序,但 equal_range 的行为依然只基于当前比较器——旧数据没“重排”,只是你查的方式变了。这时候结果可能和预期完全对不上。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Sass和less的区别
Sass和less的区别

Sass和less的区别有语法差异、变量和混合器的定义方式、导入方式、运算符的支持、扩展性等。本专题为大家提供Sass和less相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.10.12

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

302

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

196

2025.07.04

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

64

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

44

2025.11.27

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

67

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号