GESP7级C++考试语法知识(四、哈希表(4、unordered_map)
第四课:《藏宝图仓库——认识 unordered_map》
一、终于来到真正的藏宝图仓库!
经过前三课的冒险,同学们已经认识了:
✅ 哈希表
✅ 哈希函数
✅ 哈希冲突
今天。
智慧大臣决定带大家参观王国最神秘的地方:
🏆 藏宝图仓库
据说这里保存着全国最重要的资料:
学生姓名 → 分数 学号 → 学生信息 宠物名字 → 等级 城市名字 → 人口国王说:
“以前这些东西都记在大本子里。”
“查找太慢了。”
于是。
程序王国发明了:
unordered_map二、什么是 unordered_map?
1、先不要被这个长长的名字吓到。
拆开来看:
unordered + map其中:
map意思是:
映射也就是:
一个东西 对应 另一个东西例如:
Tom → 95 Jack → 88 Mike → 100这就叫:
名字 → 分数映射。
2、我们来看:
unordered_mapunordered = un(不)+ ordered(有序的)= 无序的
3、在 C++ 中的对比:
| 容器 | 含义 | 底层结构 | 顺序 |
|---|---|---|---|
map | 有序映射 | 红黑树 | ✅ 按 key 排序 |
unordered_map | 无序映射 | 哈希表 | ❌ 不保证顺序 |
一句话:unordered就是"不排序",遍历时元素顺序不可预测,但查询速度更快(平均 O(1))。
三、藏宝图仓库长什么样?
1、假设有三个学生:
Tom Jack Mike2、对应成绩:
95 88 1003、在仓库里保存成:
Tom → 95 Jack → 88 Mike → 1004、这里:
Tom Jack Mike叫:
Key(键)
5、而:
95 88 100叫:
Value(值)
6、记住:
Key 找 Value这就是哈希表的核心思想。
四、第一个 unordered_map
1、先学会创建仓库。
2、代码:
#include <iostream> #include <unordered_map> using namespace std; int main() { unordered_map<string,int> score; }3、这句话:
unordered_map<string,int> score;表示:
字符串 → 整数映射。
4、就是题目中的:
姓名 → 分数例如:
Tom → 95五、什么是 string 和 int?
1、这里:
unordered_map<string,int>有两个类型。
第一个:
string表示:
钥匙(Key)类型。
第二个:
int表示:
值(Value)类型。
2、例如:
unordered_map<string,int>表示:
姓名 → 分数3、再比如:
unordered_map<int,string>表示:
学号 → 姓名例如:
1001 → Tom 1002 → Jack六、往仓库放宝藏
1、仓库建好了,接下来放数据。
2、代码:
score["Tom"] = 95;意思:
Tom → 95继续:
score["Jack"] = 88; score["Mike"] = 100;仓库变成:
Tom → 95 Jack → 88 Mike →100图示:
┌─────────┐ │ Tom │──►95 ├─────────┤ │ Jack │──►88 ├─────────┤ │ Mike │──►100 └─────────┘七、查询宝藏
1、国王来了。
他问:
“快告诉我 Tom 的成绩!”
2、以前:
一个一个找3、现在:
直接:
cout << score["Tom"];输出:
954、哈希表自动找到对应位置。
速度飞快!
八、完整程序
#include <iostream> #include <unordered_map> using namespace std; int main() { unordered_map<string,int> score; score["Tom"] = 95; score["Jack"] = 88; score["Mike"] = 100; cout << score["Tom"] << endl; cout << score["Jack"] << endl; cout << score["Mike"] << endl; return 0; }输出:
95 88 100九、修改宝藏
1、假设期末考试结束。
Tom进步了。
原来:
Tom → 95现在:
Tom → 99怎么办?
非常简单。
2、直接重新赋值:
score["Tom"] = 99;仓库自动更新。
3、再次查询:
cout << score["Tom"];输出:
99十、一个神奇现象
1、观察代码:
score["Tom"] = 95;这里:
score["Tom"]像不像数组?
数组:
a[3]表示:
下标3哈希表:
score["Tom"]表示:
下标Tom是不是很神奇?
2、数组只能:
0 1 2 3作为下标。
而哈希表:
Tom Jack Mike都能作为下标!
十一、遍历仓库
1、如果想看看所有数据。
可以使用:
for(auto p : score) { cout << p.first << " " << p.second << endl; }2、这里:
p.first表示:
Key即:
Tom Jack Mike3、而:
p.second表示:
Value即:
95 88 100十二、藏宝图管理系统实战
1、假设王国举办考试。
输入:
Tom 95 Jack 88 Mike 1002、代码:
#include <iostream> #include <unordered_map> using namespace std; int main() { unordered_map<string,int> score; score["Tom"] = 95; score["Jack"] = 88; score["Mike"] = 100; string name; cin >> name; cout << score[name]; return 0; }输入:
Tom输出:
95输入:
Mike输出:
1003、这就是哈希表最经典的用途:
姓名查分数十三、生活中的 unordered_map
其实它无处不在。
1、学校系统
学号 → 学生2、电话簿
姓名 → 电话3、游戏
角色名 → 等级4、宠物系统
宠物名 → 战斗力5、字典
单词 → 中文6、这些都可以用:
unordered_map完成。
十四、课堂挑战
1、现在有:
unordered_map<string,int> pet;2、执行:
pet["Dog"] = 50; pet["Cat"] = 40; pet["Dragon"] = 100;问题1:
pet["Dog"]是多少?
答案:
50问题2:
pet["Dragon"]是多少?
答案:1
100问题3:
执行:
pet["Dog"] = 80;后。
pet["Dog"]是多少?
答案:
80本课总结
1、今天我们正式学会了 C++ 中最常用的哈希表:
🏆 unordered_map
2、创建:
unordered_map<string,int> mp;3、插入:
mp["Tom"] = 95;4、查询:
cout << mp["Tom"];5、修改:
mp["Tom"] = 100;6、遍历:
for(auto p : mp) { cout << p.first << " " << p.second; }魔法口诀
藏宝仓库真神奇, 姓名竟能当下标。 存数据,用等号; 查数据,用方括号。 Key找到Value快, 这就是哈希表。 unordered_map本领大, 查找速度顶呱呱!下一课,我们将进入哈希表最经典、最常见、最重要的应用:
《人数统计中心——统计出现次数》
到时候你会发现:
cnt[x]++;竟然能轻松解决大量比赛题目!
🚀
