STL课程第九课《智能电话本——认识Map映射》本课目标理解什么是 Map映射。理解键Key和值Value的概念。掌握[]、insert()、find()、count()、erase()、size()、empty()的使用。能利用 Map 建立对应关系。能利用 Map 完成简单统计。第一幕 神奇电话本今天。程序王国来了一个新的管理员。他说我有一本神奇电话本。里面记录着小明 → 13888888888 小红 → 13999999999 小刚 → 13666666666如果我知道小明能不能立刻找到电话号码今天我们认识的新朋友。叫Map中文名字映射或者键值对容器它最大的本领就是一个东西对应另一个东西。第二幕 什么叫映射画图姓名 小明 ─────────► 13888888888 小红 ─────────► 13999999999 小刚 ─────────► 13666666666左边。叫Key键右边。叫Value值一句口诀通过Key找到Value。第三幕 Map还能保存什么继续画图。不仅姓名。还能国家。China ↓ 广州 USA ↓ 纽约还能动物。Cat ↓ 猫 Dog ↓ 狗还能学号。1001 ↓ 张三Map就是建立对应关系。第四幕 请出Map头文件#includeiostream #includemap using namespace std;创建mapstring,string phone;解释前面的string表示姓名。后面的string表示电话号码。提醒Map要写两个类型。左边。右边。可以分别设定。第五幕 添加电话最简单的方法phone[小明]13888888888; phone[小红]13999999999; phone[小刚]13666666666;画图小明 ↓ 13888888888第六幕 查电话请问小明电话多少程序coutphone[小明];输出13888888888是不是很方便第七幕 修改电话如果小明换号码了。程序phone[小明]18888888888;再输出coutphone[小明];结果18888888888总结再次赋值就是修改。第八幕 Map还能统计次数今天拿了苹果 香蕉 苹果 苹果 香蕉请问苹果拿了几次以前。需要循环统计。今天使用Map。一句话。mapstring,int cnt;每来一个水果。cnt[name];结束以后。coutcnt[苹果];输出3同学们惊呼这么简单第九幕 为什么能解释。开始Map里面没有苹果。程序自动设置苹果 ↓ 0然后拿了苹果就变成1以后再来。继续2 3 4Map非常聪明。不存在。就自动创建。初始值是0。因为设置的是 int 型第十幕 遍历MapMap里面不是一个数字。而是很多Key。Value。详细介绍for(auto x:phone) { coutx.first ; coutx.secondendl; }解释first就是左边。Key。second就是右边。Value。例如输出小刚 13666666666 小明 18888888888 小红 13999999999还有特别棒的是Map 会按照 Key 自动排序。第十一幕 find()如果问有没有小明程序if(phone.find(小明)!phone.end()) { cout找到; }map和Set一样。找不到。返回end()第十二幕 erase()删除phone.erase(小红);以后。电话本。就没有小红了。第十三幕 count()请问有没有小刚coutphone.count(小刚);输出1如果没有。输出0第十四幕 演示程序#includeiostream #includemap using namespace std; int main() { mapstring,string phone; phone[小明]13888888888; phone[小红]13999999999; phone[小刚]13666666666; cout小明电话; coutphone[小明]endl; coutendl; for(auto x:phone) { coutx.first ; coutx.secondendl; } return 0; }第十五幕 课堂实践一——统计单词出现次数输入apple banana apple orange apple banana要求输出apple 3 banana 2 orange 1参考程序#includeiostream #includemap using namespace std; int main() { mapstring,int cnt; int n; cinn; while(n--) { string s; cins; cnt[s]; } for(auto x:cnt) { coutx.first x.secondendl; } return 0; }这是Map最经典的用途。第十六幕 课堂实践二——学生成绩查询输入Tom 98 Lucy 100 Jack 95然后输入Lucy输出100是不是马上会想到刚学的电话本第十七幕 Set 和 Map 有什么区别画图。Set苹果 香蕉 西瓜只有一个东西。Map苹果 ↓ 5元 香蕉 ↓ 3元 西瓜 ↓ 12元总结Set只有Key。Map有Key和Value。本课总结今天我们认识了Map映射。它最大的特点就是一个Key对应一个Value。我们掌握了七个最常用的成员函数成员函数作用生活中的理解m[key]添加、修改、查询根据名字查电话insert()插入一组键值对新增联系人find()查找Key找联系人count()判断Key是否存在是否有这个联系人erase()删除Key删除联系人size()元素个数电话本里有多少联系人empty()是否为空电话本是不是空的 一定要讲的知识——[]与find()的区别这是很多同学最容易踩坑的地方。现场演示mapstring,int cnt; coutcnt[apple]endl;输出0再问Map里面原来有apple吗没有但是执行这一句后cnt[apple]Map 会自动创建apple ↓ 0所以m[key]不仅可以查询。还可能自动新增元素。而find()只是查找。不会增加任何东西。一句话口诀[]会顺手建档案find()只负责找档案。 竞赛思维以后。很多信奥赛题都会使用mapint,int cnt;或者mapstring,int cnt;看到cnt[x];就应该立刻想到这是在统计出现次数这是Map 在 GESP、CSP-J、NOIP 中出现频率最高的用法之一。