⭐一、map的简介
map是C++STL中的一个关联式容器,它提供一对一的hash,它类似于Python中的字典
,也有着键值对(Key-Value)
这一说。我们可以通过键(Key)来找到值(Value),但需要注意的是,每个键(Key)只能在map中出现一次哦!
map可以储存多种类型的数据,它主要用于一对一映射
的情况,map内部的实现是通过自建一颗红黑树,这颗树可以对数据进行自动排序
。所以在map内部所有的数据都是有序
的,这个功能以后可以方便我们解决很多问题。
使用map时需要包含头文件:
#include<map>
⭐二、map的定义及初始化
- 定义
map<数据类型1,数据类型2>变量名
例:
//map的定义 map<int,int> m1; //定义一个Key数据类型为int,Value数据类型为int的map容器m1 map<double,double> m2; //定义一个Key数据类型为double,Value数据类型为double的map容器m2 map<int,string> m3; //定义一个Key数据类型为int,Value数据类型为string的map容器m3
⭐三、map中常用的成员函数
map中的一些函数:
//map中的常用函数 find() //返回键Key所在的位置(迭代器) insert() //向map中插入元素 1. m1.insert(pair<int,string>(1,"ctx")); //插入一个pair对象 2. m1.insert(map<int,sting>::value_type(2,"cxt")); //插入一个value_type数据 3. m1[111]="66666"; //用“数组赋值”的方法插入 erase() //删除元素 1. m2.erase(it); //it为被删除元素的迭代器 2. m2.erase(key);//key为被删除的键 3. m2.erase(first,last); //删除区间内的所有元素 size() //返回map中映射的对数 clear()//清空map中的所有元素 begin() //返回指向map头部的迭代器 end() //返回指向map尾部+1的迭代器 rebegin() //返回指向map尾部的迭代器 rend() //返回指向map头部-1的迭代器 empty() //判断是否为空
⭐四、map的遍历
- 通过iterator迭代器遍历
#include<iostream> #include<map> using namespace std; int main() { map<int,string> m1; m1[1]="ctx"; m1[2]="cxt"; m1[3]="txc"; m1[10]="txt"; m1[5]="666"; map<int,string>::iterator it; for(it=m1.begin();it!=m1.end();it++) { cout<<it->first<<" "<<it->second<<endl; } //it->为Key,it->second为Value }
⭐五、map的真题巩固
下面是PTA中数据结构与算法题目集(中文)的一道25分题,对于我们刚学习完本文map用法后的小伙伴来说可能稍有难度,可以自己尝试一下喔!
下方为题目链接!!!!!!!!
题目详情:
假设全校有最多40000名学生和最多2500门课程。现给出每门课的选课学生名单,要求输出每个前来查询的学生的选课清单。注意:每门课程的选课人数不可超过 200 人。
输入格式:
输入的第一行是两个正整数:N(≤40000),为前来查询课表的学生总数;K(≤2500),为总课程数。此后顺序给出课程1到K的选课学生名单。格式为:对每一门课,首先在一行中输出课程编号(简单起见,课程从1到K编号)和选课学生总数(之间用空格分隔),之后在第二行给出学生名单,相邻两个学生名字用1个空格分隔。学生姓名由3个大写英文字母+1位数字组成。选课信息之后,在一行内给出了N个前来查询课表的学生的名字,相邻两个学生名字用1个空格分隔。
输出格式:
对每位前来查询课表的学生,首先输出其名字,随后在同一行中输出一个正整数C,代表该生所选的课程门数,随后按递增顺序输出C个课程的编号。相邻数据用1个空格分隔,注意行末不能输出多余空格。
输入样例:
10 5
1 4
ANN0 BOB5 JAY9 LOR6
2 7
ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6
3 1
BOB5
4 7
BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
5 9
AMY7 ANN0 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6
输出样例:
ZOE1 2 4 5
ANN0 3 1 2 5
BOB5 5 1 2 3 4 5
JOE4 1 2
JAY9 4 1 2 4 5
FRA8 3 2 4 5
DON2 2 4 5
AMY7 1 5
KAT3 3 2 4 5
LOR6 4 1 2 4 5
AC代码:
#include<bits/stdc++.h> using namespace std; int main() { map<string,vector<int>>mp; int n,k; cin>>n>>k; int l,r; string s; s.resize(5); for(int i=1;i<=k;i++) { cin>>l>>r; for(int j=1;j<=r;j++) { cin>>s; mp[s].push_back(l); } } while(scanf("%s",&s[0])!=EOF) { cout<<s<<" "<<mp[s].size(); if(mp[s].size()) { sort(mp[s].begin(),mp[s].end()); for(auto it=mp[s].begin();it!=mp[s].end();it++) { cout<<" "<<*it; } } cout<<endl; } }
⭐六、写在最后
OK本文的学习就到此结束啦,希望本文可以帮助到各位有需要的小伙伴们喔,也希望各位小伙伴们不要吝惜手里的三连哦!❤️❤️❤️
💕 回头看,轻舟已过万重山,向前看,前路漫漫亦漫漫。