news 2026/6/20 18:42:17

GESP7级C++考试语法知识(四、哈希表(4、unordered_map)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GESP7级C++考试语法知识(四、哈希表(4、unordered_map)


第四课:《藏宝图仓库——认识 unordered_map》


一、终于来到真正的藏宝图仓库!

经过前三课的冒险,同学们已经认识了:

✅ 哈希表

✅ 哈希函数

✅ 哈希冲突


今天。

智慧大臣决定带大家参观王国最神秘的地方:

🏆 藏宝图仓库


据说这里保存着全国最重要的资料:

学生姓名 → 分数 学号 → 学生信息 宠物名字 → 等级 城市名字 → 人口

国王说:

“以前这些东西都记在大本子里。”

“查找太慢了。”


于是。

程序王国发明了:

unordered_map

二、什么是 unordered_map?

1、先不要被这个长长的名字吓到。

拆开来看:

unordered + map

其中:

map

意思是:

映射

也就是:

一个东西 对应 另一个东西

例如:

Tom → 95 Jack → 88 Mike → 100

这就叫:

名字 → 分数

映射。


2、我们来看:

unordered_map

unordered = un(不)+ ordered(有序的)= 无序的


3、在 C++ 中的对比:

容器含义底层结构顺序
map有序映射红黑树✅ 按 key 排序
unordered_map无序映射哈希表❌ 不保证顺序

一句话unordered就是"不排序",遍历时元素顺序不可预测,但查询速度更快(平均 O(1))。


三、藏宝图仓库长什么样?

1、假设有三个学生:

Tom Jack Mike

2、对应成绩:

95 88 100

3、在仓库里保存成:

Tom → 95 Jack → 88 Mike → 100

4、这里:

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"];

输出:

95

4、哈希表自动找到对应位置。

速度飞快!


八、完整程序

#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 Mike

3、而:

p.second

表示:

Value

即:

95 88 100

十二、藏宝图管理系统实战

1、假设王国举办考试。

输入:

Tom 95 Jack 88 Mike 100

2、代码:

#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

输出:

100

3、这就是哈希表最经典的用途:

姓名查分数

十三、生活中的 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]++;

竟然能轻松解决大量比赛题目!

🚀


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 18:29:18

企业级文件传输安全实践:基于SFTP与密钥认证的FileZilla配置指南

1. 项目概述&#xff1a;为什么企业级文件传输需要告别密码 在企业的日常运维和开发协作中&#xff0c;文件传输是个高频且基础的动作。无论是将代码部署到服务器&#xff0c;还是从生产环境拉取日志进行分析&#xff0c;一个安全、高效、稳定的传输通道都至关重要。很多团队初…

作者头像 李华
网站建设 2026/6/20 18:28:04

AI测试智能体精准操作实战:Playwright与MCP协议集成优化

1. 项目概述&#xff1a;当AI测试智能体“手滑”时最近在折腾一个基于Playwright和MCP&#xff08;Model Context Protocol&#xff09;的AI测试智能体项目&#xff0c;目标很美好&#xff1a;让AI像真人一样操作网页&#xff0c;自动完成复杂的端到端测试。但现实很快给了我一…

作者头像 李华
网站建设 2026/6/20 18:25:12

嵌入式系统硬件安全模块:MIFARE SAM AV3密钥管理与应用实践

1. 项目概述&#xff1a;为什么嵌入式系统需要一个“保险柜”&#xff1f;在物联网和嵌入式系统遍地开花的今天&#xff0c;我们身边充斥着各种需要身份验证和访问控制的设备&#xff1a;刷一下就能进出的办公室门禁、滴一声完成扣费的公交卡、甚至是你家小区那个需要刷卡才能进…

作者头像 李华
网站建设 2026/6/20 18:09:52

漏洞挖掘体验感危机:从自动化红海到深度研究蓝海的策略升级

1. 项目概述&#xff1a;当“秒杀”成为常态&#xff0c;漏洞挖掘的体验感危机 “漏洞挖掘_还没开始就结束了&#xff1f;行不行啊&#xff01;毫无体验感”——这个标题精准地戳中了许多安全研究员、渗透测试工程师&#xff0c;甚至是刚入门白帽子的痛点。它描述的是一种在漏洞…

作者头像 李华
网站建设 2026/6/20 18:00:16

MPC561/MPC563微控制器核心架构解析与汽车电子开发实战

1. 项目概述&#xff1a;深入解析MPC561/MPC563微控制器核心架构在汽车电子、工业控制这些对实时性和可靠性要求极高的领域&#xff0c;选对一颗“心脏”——微控制器&#xff08;MCU&#xff09;——往往决定了整个系统的成败。今天要聊的MPC561/MPC563系列&#xff0c;就是飞…

作者头像 李华