)
第四课《藏宝图仓库——认识 unordered_map》一、终于来到真正的藏宝图仓库经过前三课的冒险同学们已经认识了✅ 哈希表✅ 哈希函数✅ 哈希冲突今天。智慧大臣决定带大家参观王国最神秘的地方 藏宝图仓库据说这里保存着全国最重要的资料学生姓名 → 分数 学号 → 学生信息 宠物名字 → 等级 城市名字 → 人口国王说“以前这些东西都记在大本子里。”“查找太慢了。”于是。程序王国发明了unordered_map二、什么是 unordered_map1、先不要被这个长长的名字吓到。拆开来看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_map1、先学会创建仓库。2、代码#include iostream #include unordered_map using namespace std; int main() { unordered_mapstring,int score; }3、这句话unordered_mapstring,int score;表示字符串 → 整数映射。4、就是题目中的姓名 → 分数例如Tom → 95五、什么是 string 和 int1、这里unordered_mapstring,int有两个类型。第一个string表示钥匙(Key)类型。第二个int表示值(Value)类型。2、例如unordered_mapstring,int表示姓名 → 分数3、再比如unordered_mapint,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_mapstring,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_mapstring,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_mapstring,int pet;2、执行pet[Dog] 50; pet[Cat] 40; pet[Dragon] 100;问题1pet[Dog]是多少答案50问题2pet[Dragon]是多少答案1100问题3执行pet[Dog] 80;后。pet[Dog]是多少答案80本课总结1、今天我们正式学会了 C 中最常用的哈希表 unordered_map2、创建unordered_mapstring,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];竟然能轻松解决大量比赛题目