当前位置:首页 > C++ > 正文

深入理解C++ multimap(副标题:STL中支持重复键的关联容器详解)

在C++标准模板库(STL)中,multimap 是一个非常有用的关联容器。与 map 不同,multimap 允许同一个键(key)对应多个值(value),非常适合处理“一对多”关系的数据。本教程将从基础概念到实际用法,手把手带你掌握 multimap 的使用方法,即使是编程小白也能轻松上手。

深入理解C++ multimap(副标题:STL中支持重复键的关联容器详解) C++ multimap  STL容器 关联容器 多重映射 第1张

一、什么是 multimap?

multimap 是 C++ STL 中的一个容器,定义在头文件 <map> 中。它的主要特点包括:

  • 每个元素是一个键值对(pair<const Key, T>
  • 允许重复的键(这是与 map 最大的区别)
  • 内部通常基于红黑树实现,元素按键自动排序
  • 插入、删除、查找的时间复杂度为 O(log n)

常见的应用场景包括:

  • 一个学生有多个课程成绩
  • 一个用户有多条订单记录
  • 一个单词在文档中出现的多个位置

二、基本语法与声明

要使用 multimap,首先需要包含头文件:

#include <map>#include <iostream>using namespace std;

声明一个 multimap 的基本语法如下:

multimap<KeyType, ValueType> myMultimap;

例如,创建一个存储字符串键和整数值的 multimap

multimap<string, int> scores;

三、常用操作详解

1. 插入元素

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

scores.insert(make_pair("Alice", 85));scores.insert(make_pair("Bob", 90));scores.insert(make_pair("Alice", 92)); // 同一个键可以多次插入

也可以使用 C++11 的花括号初始化:

scores.insert({"Charlie", 78});

2. 遍历 multimap

由于 multimap 是有序容器,遍历时会按键的升序输出:

for (auto it = scores.begin(); it != scores.end(); ++it) {    cout << it->first << ": " << it->second << endl;}// 或者使用范围 for(C++11)for (const auto& pair : scores) {    cout << pair.first << ": " << pair.second << endl;}

3. 查找特定键的所有值

使用 equal_range() 可以获取某个键对应的所有值:

auto range = scores.equal_range("Alice");for (auto it = range.first; it != range.second; ++it) {    cout << "Alice's score: " << it->second << endl;}

4. 统计某个键出现的次数

使用 count() 方法:

cout << "Alice has " << scores.count("Alice") << " scores." << endl;

四、完整示例代码

#include <iostream>#include <map>using namespace std;int main() {    multimap<string, int> studentScores;    // 插入数据    studentScores.insert({"张三", 88});    studentScores.insert({"李四", 92});    studentScores.insert({"张三", 95});    studentScores.insert({"王五", 78});    studentScores.insert({"张三", 85});    // 遍历所有数据    cout << "所有学生成绩:\n";    for (const auto& p : studentScores) {        cout << p.first << " -> " << p.second << endl;    }    cout << "\n张三的所有成绩:\n";    auto range = studentScores.equal_range("张三");    for (auto it = range.first; it != range.second; ++it) {        cout << it->second << " ";    }    cout << endl;    cout << "\n张三共有 " << studentScores.count("张三") << " 门成绩。" << endl;    return 0;}

五、multimap 与 map 的区别

特性 map multimap
是否允许重复键
[] 操作符 支持 不支持
典型用途 一对一映射 一对多映射

六、总结

multimap 是 C++ STL 中处理“一对多”关系的强大工具。它继承了关联容器的高效性和自动排序特性,同时突破了 map 键唯一性的限制。通过本教程,你应该已经掌握了如何声明、插入、遍历和查询 multimap 中的数据。

记住几个关键点:

  • multimap 支持重复键,适合表示多重映射关系
  • 不能使用 [] 操作符(因为一个键对应多个值)
  • 使用 equal_range()count() 来处理重复键
  • 元素按键自动排序,底层通常是红黑树

希望这篇关于 C++ multimap 的教程能帮助你更好地理解和使用这个强大的 STL 容器!