哈希表(Hash Table)是一种数据结构,用于存储键值对(key-value pairs),以便能够快速地插入、删除和查找元素。它的基本思想是通过一个称为“哈希函数”(hash function)的映射关系,将键转换为数组的一个索引位置,从而实现高效的访问。
基本语法
包含头文件
首先需要包含<unordered_map>
头文件:
#include <unordered_map>
定义哈希表
定义一个std::unordered_map
对象,其中键和值的类型可以是任何支持比较的操作数类型(例如int
, string
等)。
std::unordered_map<KeyType, ValueType> mapName;
例如,定义一个键为int
,值也为int
的哈希表:
std::unordered_map<int, int> myMap;
插入元素
使用方括号[]
或insert
方法插入元素。
myMap[key] = value; // 使用方括号插入或更新元素
myMap.insert({key, value}); // 使用insert方法插入元素
查找元素
使用find
方法查找元素,返回一个迭代器。如果找不到则返回map.end()
。
auto it = myMap.find(key);
if (it != myMap.end()) {
std::cout << "Key found: " << it->first << ", Value: " << it->second << std::endl;
} else {
std::cout << "Key not found." << std::endl;
}
删除元素
使用erase
方法删除元素。
myMap.erase(key); // 按键删除
myMap.erase(it); // 按迭代器删除
遍历哈希表
使用范围for循环遍历哈希表中的所有键值对。
for (const auto& pair : myMap) {
std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;
}
完整示例
下面是一个完整的示例,展示了如何使用std::unordered_map
进行插入、查找和删除操作:
C++中使用std::unordered_map的示例
//c++中使用unordered_map的示例
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
// 定义一个键为int,值为int的哈希表
unordered_map<int, int> myMap;
// 插入元素
myMap[1] = 100;
myMap[2] = 200;
myMap[3] = 300;
// 使用insert方法插入元素
myMap.insert({4, 400});
// 查找元素
int keyToFind = 2;
if (myMap.find(keyToFind) != myMap.end()) {
cout << "Key " << keyToFind << " found with value " << myMap[keyToFind] << endl;
} else {
cout << "Key " << keyToFind << " not found." << endl;
}
// 遍历哈希表
cout << "All elements in the hash table:" << endl;
for (const auto& pair : myMap) {
cout << "Key: " << pair.first << ", Value: " << pair.second << endl;
}
// 删除元素
myMap.erase(2);
// 再次遍历哈希表
cout << "Elements after deleting key 2:" << endl;
for (const auto& pair : myMap) {
cout << "Key: " << pair.first << ", Value: " << pair.second << endl;
}
return 0;
}
解释
- 定义哈希表:
unordered_map<int, int> myMap;
- 插入元素:
myMap[1] = 100;
myMap.insert({4, 400});
- 查找元素:
auto it = myMap.find(keyToFind);
- 检查迭代器是否等于
myMap.end()
以确定键是否存在。
- 遍历哈希表:
- 使用范围for循环遍历所有键值对。
- 删除元素:
myMap.erase(2);
按键删除。myMap.erase(it);
按迭代器删除。
具体样例使用:查找众数
从输入中读取一组整数,并找出其中出现次数最多的数字(众数)。如果有多个众数,则按从小到大的顺序输出所有众数。
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; ++i)
{
cin >> numbers[i];
}
unordered_map<int, int> frequencyMap;
for (int num : numbers)
{
frequencyMap[num]++;
}
int maxFrequency = 0;
for (const auto& pair : frequencyMap)
{
if (pair.second > maxFrequency)
{
maxFrequency = pair.second;
}
}
vector<int> modes;
for (const auto& pair : frequencyMap)
{
if (pair.second == maxFrequency)
{
modes.push_back(pair.first);
}
}
sort(modes.begin(), modes.end());
for (int mode : modes)
{
cout << mode << " ";
}
cout << endl;
return 0;
}
统计频率
unordered_map<int, int> frequencyMap;
for (int num : numbers)
{
frequencyMap[num]++;
}
unordered_map<int, int> frequencyMap;
:声明一个无序哈希表frequencyMap
,键为整数,值为该整数出现的次数。for (int num : numbers)
:遍历numbers
向量中的每个元素。frequencyMap[num]++;
:对于每个元素num
,将其在frequencyMap
中的计数值加1。
找出最大频率
int maxFrequency = 0;
for (const auto& pair : frequencyMap)
{
if (pair.second > maxFrequency)
{
maxFrequency = pair.second;
}
}
int maxFrequency = 0;
:初始化一个整数变量maxFrequency
,用于存储最高的出现次数。for (const auto& pair : frequencyMap)
:遍历frequencyMap
中的每个键值对。if (pair.second > maxFrequency)
:如果当前键值对的值(即某个数字的出现次数)大于maxFrequency
,则更新maxFrequency
。
收集众数
vector<int> modes;
for (const auto& pair : frequencyMap)
{
if (pair.second == maxFrequency)
{
modes.push_back(pair.first);
}
}
vector<int> modes;
:声明一个整数向量modes
,用于存储所有的众数。for (const auto& pair : frequencyMap)
:再次遍历frequencyMap
中的每个键值对。if (pair.second == maxFrequency)
:如果当前键值对的值等于maxFrequency
,则将对应的键(即众数)添加到modes
向量中。
排序并输出众数
sort(modes.begin(), modes.end());
for (int mode : modes)
{
cout << mode << " ";
}
cout << endl;
return 0;
}
sort(modes.begin(), modes.end());
:对modes
向量进行排序,确保众数按从小到大的顺序排列。for (int mode : modes)
:遍历modes
向量中的每个元素。cout << mode << " ";
:输出每个众数,之间用空格分隔。cout << endl;
:输出换行符。return 0;
:返回0,表示程序成功结束。
这段代码通过使用unordered_map
来统计每个数字的出现次数,然后找出出现次数最多的数字(众数),并将这些众数按从小到大的顺序输出。