讲师中心 微信公众号
AI工具推荐 视频效率加速

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

云晨小哥_2443

云晨小哥_2443

发布时间:2025-12-05 10:31:03

|

701人浏览过

|

来源于php中文网

原创

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 <map>
  • 定义方式:std::multimap<KeyType, ValueType> mm;
  • 元素自动按 key 排序
  • 允许重复 key
  • 不支持通过下标直接访问(如 mm["a"] 不推荐用于 multimap)

常用操作方法

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

1. 插入元素

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

使用 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 的所有元素

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

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

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 在需要保留重复键并保持有序的场景中非常实用,掌握它的基本操作和边界情况,能有效提升数据管理效率。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
counta和count的区别
counta和count的区别

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

2508

2023.11.20

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3048

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4349

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3689

2025.12.29

java接口相关教程
java接口相关教程

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

386

2026.01.19

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

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

450

2025.09.05

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

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

323

2025.11.16

golang map原理
golang map原理

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

493

2025.11.17

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

180

2026.09.23

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn