C++ 编程基础:深入理解 pair
(键值对) 和 unordered_map
(无序映射)
在 C++ 标准库中,
pair
(键值对)和unordered_map
(无序映射)是两种常用的数据结构,它们广泛应用于各种编程场景。pair
用于存储两个相关联的值,而unordered_map
通过哈希表来存储键值对,并提供高效的查找操作。本文将详细介绍这两种数据结构的定义、应用场景、核心原理和实现方法,并通过代码示例来说明它们的具体用法。
文章目录
-
- [C++ 编程基础:深入理解 `pair`(键值对) 和 `unordered_map`(无序映射)](#C++ 编程基础:深入理解
pair
(键值对) 和unordered_map
(无序映射)) -
- 一、概述
- 二、`pair`(键值对)详解
-
- [2.1 `pair` 的定义](#2.1
pair
的定义) - [2.2 应用场景](#2.2 应用场景)
- [2.3 示例代码](#2.3 示例代码)
- [2.4 注意事项](#2.4 注意事项)
- [2.1 `pair` 的定义](#2.1
- 三、`unordered_map`(无序映射)详解
-
- [3.1 `unordered_map` 的定义](#3.1
unordered_map
的定义) - [3.2 应用场景](#3.2 应用场景)
- [3.3 示例代码](#3.3 示例代码)
- [3.4 注意事项](#3.4 注意事项)
- [3.1 `unordered_map` 的定义](#3.1
- [四、`pair` 和 `unordered_map` 的联系(★可直接看表格对比)](#四、
pair
和unordered_map
的联系(★可直接看表格对比)) -
- [4.1 对比表格](#4.1 对比表格)
- [4.2 示例:`unordered_map` 和 `pair` 的结合使用](#4.2 示例:
unordered_map
和pair
的结合使用)
- 五、结论
- [C++ 编程基础:深入理解 `pair`(键值对) 和 `unordered_map`(无序映射)](#C++ 编程基础:深入理解
一、概述
pair
(键值对) 是 C++ 中的一种简单结构,用于将两个相关联的值绑定在一起。常用于需要将两个数据成对存储的场景,如坐标对(x, y),或需要保存键值对时使用的 unordered_map
之类的数据结构。
unordered_map
(无序映射) 则是一种基于哈希表的键值对容器,能够通过键快速查找对应的值。在 C++ 中,unordered_map
允许以 O(1) 的时间复杂度进行查找、插入和删除操作,适用于大规模数据的高效处理。
二、pair
(键值对)详解
2.1 pair
的定义
pair
是 C++ 标准库中的模板类,用于将两个相关联的值存储在一起。它包含两个成员变量,first
和 second
,分别表示这两个元素。通过 pair
,我们可以将两个不同类型的值结合在一起,形成一个简单的键值对结构。
定义:
cpp
template <class T1, class T2>
struct pair {
T1 first; // 第一个值
T2 second; // 第二个值
};
2.2 应用场景
pair
广泛用于需要将两个数据关联存储的场景。它特别适用于以下情况:
- 关联数据 :在某些情况下,我们需要将两个相关数据存储在一起,例如一个键和它对应的值。
pair
提供了一种简单的方式来实现这一点。 - 返回多个值 :在函数中,
pair
也可以用作返回多个值的方式,因为 C++ 函数一次只能返回一个对象。使用pair
可以让函数同时返回两个相关联的值。
尽管 pair
可以在某些数据结构中使用(例如 map
或 unordered_map
),但这里强调的是它自身的结构特性,不应与这些数据结构混淆。
2.3 示例代码
以下代码展示了如何使用 pair
存储两个相关联的数据(一个整数和一个字符串),并输出它们的值。
cpp
#include <iostream>
#include <utility> // 引入pair的头文件
using namespace std;
int main() {
pair<int, string> p; // 定义一个pair,类型为int和string
p.first = 1; // 设置第一个值
p.second = "apple"; // 设置第二个值
cout << "第一个值:" << p.first << endl; // 输出第一个值
cout << "第二个值:" << p.second << endl; // 输出第二个值
return 0;
}
解释 :在这个例子中,pair
被用来存储一个整数和一个字符串,通过 p.first
访问第一个元素,p.second
访问第二个元素。程序输出:
第一个值:1
第二个值:apple
2.4 注意事项
- 类型限制 :
pair
的两个元素可以是不同的类型,但每个元素的类型必须在声明时确定。即使pair
可以存储任意类型的组合,但设计时应考虑到使用场景。 - 用途有限 :
pair
仅能存储两个值。如果需要存储多个相关值,建议使用tuple
(元组),它允许存储任意数量的元素。
三、unordered_map
(无序映射)详解
3.1 unordered_map
的定义
unordered_map
是 C++ 标准库中基于哈希表的容器,用于存储键值对。它的查找、插入和删除操作的平均时间复杂度为 O(1),因为它使用哈希函数来快速定位键值对。
定义:
cpp
template <class Key, class T>
class unordered_map {
// 存储 Key 和 T 类型的键值对
};
3.2 应用场景
unordered_map
(无序映射)非常适用于需要通过键快速查找值的场景,例如频率统计、数据分类等。它常用于实现哈希表相关的算法,如词频统计、缓存系统等。
3.3 示例代码
以下代码展示了如何使用 unordered_map
存储多个键值对,并查找某个键是否存在。
cpp
#include <iostream>
#include <unordered_map> // 引入unordered_map的头文件
using namespace std;
int main() {
// 定义一个unordered_map,键为int,值为string
unordered_map<int, string> umap;
// 插入键值对
umap[1] = "apple";
umap[2] = "banana";
umap[3] = "cherry";
// 查找键为2的值
if (umap.find(2) != umap.end()) {
cout << "键为2的值是:" << umap.at(2) << endl; // 输出:banana
}
// 遍历unordered_map
for (const auto& entry : umap) {
cout << "键:" << entry.first << ", 值:" << entry.second << endl;
}
return 0;
}
解释 :在这个例子中,使用 unordered_map
存储了三个键值对。程序首先通过 find
方法查找键 2
对应的值,若找到则输出其值。随后,程序遍历 unordered_map
并输出所有键值对。输出如下:
键为2的值是:banana
键:1, 值:apple
键:2, 值:banana
键:3, 值:cherry
3.4 注意事项
- 哈希冲突 :由于
unordered_map
基于哈希表,可能会发生哈希冲突(即不同的键计算出的哈希值相同)。在这种情况下,unordered_map
通过链表等方式处理冲突。 - 键类型要求 :键必须能够通过哈希函数计算出哈希值,因此通常要求键类型满足以下条件:
- 支持相等比较 :键类型必须实现
==
操作符,以便在查找、插入和删除时比较键的相等性。 - 可哈希 :键类型需要支持哈希函数(如
std::hash
),这通常意味着自定义类型需要提供哈希函数的重载,以便能够在unordered_map
中正确工作。
- 支持相等比较 :键类型必须实现
四、pair
和 unordered_map
的联系(★可直接看表格对比)
在 C++ 中,unordered_map
内部是通过 pair
来存储键值对的。每个 unordered_map
元素实际上是一个 pair<const Key, T>
,其中 Key
是键,T
是值。
4.1 对比表格
特性 | pair |
unordered_map |
---|---|---|
存储结构 | 仅存储两个相关值 | 存储键值对,基于哈希表 |
查找效率 | 不支持直接查找 | 平均 O(1) 时间复杂度查找 |
用途 | 简单关联数据存储 | 高效键值对存储与查找 |
元素个数 | 仅可存储两个元素 | 可存储多个键值对 |
应用场景 | 坐标、返回多个值的函数 | 频率统计、数据分类等 |
4.2 示例:unordered_map
和 pair
的结合使用
以下代码展示了如何将 unordered_map
中的键值对转存到一个 vector<pair>
中,并对其进行排序。
cpp
#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
// 比较函数,用于按值的大小排序
bool cmp(const pair<int, string>& a, const pair<int, string>& b) {
return a.second < b.second; // 按值从小到大排序
}
int main() {
unordered_map<int, string> umap;
umap[1] = "banana";
umap[2] = "apple";
umap[3] = "cherry";
// 将unordered_map转换为vector<pair>
vector<pair<int, string>> vec(umap.begin(), umap.end());
// 按照值进行排序
sort(vec.begin(), vec.end(), cmp);
// 输出排序后的键值对
for (const auto& pair : vec) {
cout << "键:" << pair.first << ", 值:" << pair.second << endl;
}
return 0;
}
解释 :在这个例子中,首先将 unordered_map
中的键值对存入 vector<pair>
,然后使用自定义的比较函数按值对键值对进行排序。程序输出按值排序后的键值对:
键:2, 值:apple
键:1, 值:banana
键:3, 值:cherry
五、结论
pair
和 unordered_map
是 C++ 标准库中用于存储和操作键值对的两种重要数据结构 。pair
提供了简单的成对元素存储机制,而 unordered_map
则提供了高效的键值映射。两者经常结合使用,unordered_map
通过 pair
存储键值对,使得键值操作更加灵活和高效。
对于初学者,理解这两种数据结构的概念及其应用场景,可以帮助在实际编程中更好地管理和处理数据。通过本文的示例代码,你可以直观地理解它们的实现和作用,并在需要时灵活运用。
✨ 我是专业牛,一个渴望成为大牛🏆的985硕士🎓,热衷于分享知识📚,帮助他人解决问题💡,为大家提供科研、竞赛等方面的建议和指导🎯。无论是科研项目🛠️、竞赛🏅,还是图像🖼️、通信📡、计算机💻领域的论文辅导📑,我都以诚信为本🛡️,质量为先!🤝
如果你觉得这篇文章对你有所帮助,别忘了点赞👍、收藏📌和关注🔔!你的支持是我继续分享知识的动力🚀!✨ 如果你有任何问题或需要帮助,随时留言📬或私信📲,我都会乐意解答!😊