新闻中心

C++ multimap用法详解_C++允许重复key的字典容器操作

2025-12-05
浏览次数:
返回列表
multimap允许键重复且自动排序,适用于一对多映射;通过insert插入元素,equal_range查找所有相同键值,erase删除元素,count统计键频次,常用于学生成绩等场景。

c++ multimap用法详解_c++允许重复key的字典容器操作

在C++中,multimap 是一个关联式容器,属于标准模板库(STL)的一部分。它和 map 非常相似,核心区别在于:multimap 允许键(key)重复。也就是说,你可以插入多个具有相同 key 的键值对。这使得 multimap 特别适合处理“一对多”映射关系的场景,比如学生与成绩、城市与天气记录等。

multimap 基本特性

multimap 内部通常基于红黑树实现,元素按照 key 自动排序(默认升序)。每个元素都是一个 pair 类型,包含 key 和 value。由于支持重复 key,插入操作不会覆盖已有元素,而是直接添加新节点。

  • 头文件:#include
  • 定义方式:std::multimap mm;
  • 元素自动按 key 排序
  • 允许重复 key
  • 不支持通过下标直接访问(如 mm["a"] 不推荐用于 multimap)

常用操作方法

以下是 multimap 提供的核心操作接口及使用示例:

1. 插入元素

使用 insert() 方法插入键值对:

std::multimap<std::string, int> scores;
scores.insert({"Alice", 85});
scores.insert({"Bob", 90});
scores.insert({"Alice", 92}); // 允许重复 key

也可以插入 pair 对象:

scores.insert(std::make_pair("Charlie", 88));

2. 遍历所有元素

由于可能有重复 key,通常使用迭代器遍历:

for (const auto& pair : scores) {
    std::cout << pair.first << ": " << pair.second << "\n";
}

输出结果会按键排序,相同 key 的元素相邻排列。

3. 查找特定 key 的所有元素

使用 find() 只能返回第一个匹配项,要获取所有相同 key 的值,应使用 equal_range():

Mistral AI Mistral AI

Mistral AI被称为“欧洲版的OpenAI”,也是目前欧洲最强的 LLM 大模型平台

Mistral AI 182 查看详情 Mistral AI
auto range = scores.equal_range("Alice");
for (auto it = range.first; it != range.second; ++it) {
    std::cout << it->second << " "; // 输出: 85 92
}

equal_range 返回一个 std::pair,包含指向第一个和最后一个匹配元素的迭代器。

4. 删除元素

可删除指定 key 的所有元素,或仅删除某个迭代器指向的元素:

scores.erase("Alice"); // 删除所有 key 为 "Alice" 的元素
// 或者
auto it = scores.find("Bob");
if (it != scores.end()) {
    scores.erase(it); // 删除单个元素
}

5. 统计某个 key 出现次数

使用 count() 方法:

size_t cnt = scores.count("Alice"); // 返回 2

应用场景举例

假设我们要记录每个学生的多门课程成绩:

std::multimap<std::string, double> studentGrades;
studentGrades.insert({"Tom", 85.5});
studentGrades.insert({"Tom", 90.0});
studentGrades.insert({"Jerry", 78.5});
studentGrades.insert({"Tom", 88.0});

// 查询 Tom 的所有成绩
auto range = studentGrades.equal_range("Tom");
std::cout << "Tom's grades: ";
for (auto it = range.first; it != range.second; ++it) {
    std::cout << it->second << " ";
}
// 输出: Tom's grades: 85.5 90 88

这种结构比 map 更灵活,避免了手动维护 vector 等嵌套结构的复杂性。

注意事项

使用 multimap 时需注意以下几点:

  • 不能使用 mm[key] 形式访问元素,因为该操作只适用于可修改且唯一 key 的 map
  • 插入性能为 O(log n),查找单个元素也是 O(log n),但获取所有相同 key 的元素需配合 equal_range
  • 若不需要排序,仅需快速查找且允许重复 key,可考虑使用 std::unordered_multimap

基本上就这些。multimap 在需要保留重复键并保持有序的场景中非常实用,掌握它的基本操作和边界情况,能有效提升数据管理效率。

以上就是C++ multimap用法详解_C++允许重复key的字典容器操作的详细内容,更多请关注其它相关文章!


# 都是  # 石家庄网站建设大型  # 企业如何展示网站建设  # 塔城地区关键词排名  # 牡丹江大学网站建设  # 洛阳seo公司  # 获嘉seo优化快速排名  # 淡季推广旺季营销方案  # 舒城网站seo优化  # 靖江seo营销  # seo及新媒体营销教程  # 你可以  # 升序  # 是一个  # 重复key字典  # 迭代  # 欧洲  # 遍历  # 第一个  # 如何实现  # 键值  # red  # 排列  # 键值对  # 区别  # c++  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  Python字典中优雅地迭代剩余元素的方法  使用Pandas转换并合并DataFrame:多列映射至统一结构  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  解决Bootstrap卡片顶部边距导致背景图下移的问题  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  顺丰快递查单号物流信息 顺丰快递小程序查询入口  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  抖音怎么赚钱_抖音创作者变现方法与途径指南  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  必由学登录入口 必由学官方网站在线访问链接  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  在命令行怎么运行html项目_命令行运行html项目方法【教程】  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  响应式容器内容自动缩放与宽高比维持教程  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  优化Log4j2控制台输出性能:解决异步日志瓶颈  在Pyomo中实现基于变量的条件约束:Big-M方法详解  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  蛙漫移动版在线看 蛙漫手机浏览器直达入口  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  CSS实现侧边栏导航项全宽圆角悬停背景效果  J*aScript DOM操作:高效清空列表元素的策略与实践  红果短剧网页版官网入口 官方最新网址发布  Fabric模组开发:自定义物品与物品组的现代管理方法  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  实现分段式页面滚动导航:CSS与J*aScript教程  J*aScript打印功能_j*ascript输出控制  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  Golang如何使用net/url解析URL_Golang URL解析与处理方法  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  Centos/Linux 系统下安装 composer 的完整步骤  利用Bokeh CustomJS动态控制DataTable列可见性  动漫花园资源网使用步骤_动漫花园资源网下载流程  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  抖音网页版快捷访问 抖音网页版网页版入口操作教程 

搜索