0

0

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

裘德小鎮的故事

裘德小鎮的故事

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

|

661人浏览过

|

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

常用操作方法

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

1. 插入元素

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

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

std::multimap 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 的所有元素

沁言学术
沁言学术

你的论文写作AI助理,永久免费文献管理工具,认准沁言学术

下载

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

相关专题

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

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

197

2023.11.20

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

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

1023

2023.10.19

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

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

66

2025.10.17

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

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

442

2025.12.29

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相关内容,阅读专题下面的文章了解更多详细内容。

59

2025.11.17

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

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

38

2025.11.27

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP基础入门课程
PHP基础入门课程

共33课时 | 2万人学习

Python进阶视频教程
Python进阶视频教程

共30课时 | 7.9万人学习

10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

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

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