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

深入理解 C++ unordered_multimap(C++哈希表中的多值映射利器)

在 C++ 标准模板库(STL)中,unordered_multimap 是一个非常实用的关联容器,特别适用于需要存储多个相同键(key)对应不同值(value)的场景。本教程将从零开始,手把手教你掌握 C++ unordered_multimap 的基本用法、常见操作以及实际应用场景,即使你是编程小白,也能轻松上手!

深入理解 C++ unordered_multimap(C++哈希表中的多值映射利器) unordered_multimap  C++哈希表 C++关联容器 C++多值映射 第1张

什么是 unordered_multimap?

unordered_multimap 是 C++11 引入的一种基于哈希表(hash table)实现的关联容器。它与 unordered_map 类似,但关键区别在于:允许同一个键(key)对应多个值(value)。这意味着你可以插入多个具有相同 key 的键值对,而不会覆盖已有数据。

由于底层使用哈希表,unordered_multimap 的平均查找、插入和删除操作的时间复杂度为 O(1),非常适合需要高效访问大量数据的场景。

如何使用 unordered_multimap?

首先,你需要包含头文件 <unordered_map>

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

1. 声明和初始化

声明一个 unordered_multimap 非常简单,只需指定键和值的类型:

// 声明一个 key 为 string,value 为 int 的 unordered_multimapunordered_multimap<string, int> scores;

2. 插入元素

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

scores.insert({"Alice", 95});scores.insert({"Bob", 88});scores.insert({"Alice", 92}); // 允许重复 key!scores.emplace("Charlie", 78);

3. 查找和遍历

由于一个 key 可能对应多个 value,我们通常使用 equal_range() 来获取所有匹配的元素:

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

你也可以使用范围 for 循环遍历整个容器(注意:顺序是无序的!):

for (const auto& pair : scores) {    cout << pair.first << " -> " << pair.second << endl;}

4. 删除元素

可以按迭代器删除,也可以按 key 删除所有匹配项:

// 删除所有 key 为 "Alice" 的元素scores.erase("Alice");

unordered_multimap 与其它容器的对比

  • vs map:map 基于红黑树,元素有序,但插入/查找为 O(log n);unordered_multimap 无序但平均 O(1)。
  • vs unordered_map:unordered_map 不允许重复 key;unordered_multimap 允许多个相同 key。

适用场景

当你需要以下功能时,unordered_multimap 是理想选择:

  • 快速根据 key 查找多个相关 value(如:一个学生有多门课程成绩)
  • 不需要元素保持插入顺序
  • 频繁插入和查询操作

总结

unordered_multimap 是 C++ 中处理“一对多”映射关系的强大工具。作为 C++哈希表 家族的一员,它结合了哈希表的高效性和多值映射的灵活性。通过本教程,你应该已经掌握了它的基本用法,并能将其应用到实际项目中。

记住关键词:C++ unordered_multimapC++哈希表C++关联容器C++多值映射,它们是你深入学习 STL 的重要基础!