博主简介:
Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的人。
博主主页:@陈童学哦
所属专栏:C++STL
前言:
Hello各位小伙伴们好!欢迎来到本专栏C++STL的学习,本专栏旨在帮助大家了解并熟悉使用C++中的STL,C++中的STL(标准模板库)是相当好用的,🍉🍉🍉所以大家赶紧订阅一起学起来叭!那么话不多说接下来就进入本文C++中map的学习。
📢📢📢站点
- ⭐一、map的简介
- ⭐二、map的定义及初始化
- ⭐三、map中常用的成员函数
- ⭐四、map的遍历
- ⭐五、map的真题巩固
- ⭐六、写在最后
⭐一、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用法后的小伙伴来说可能稍有难度,可以自己尝试一下喔!
下方为题目链接!!!!!!!!
--------------------7-49 打印学生选课清单--------------------
题目详情:
假设全校有最多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本文的学习就到此结束啦,希望本文可以帮助到各位有需要的小伙伴们喔,也希望各位小伙伴们不要吝惜手里的三连哦!❤️❤️❤️
💕 回头看,轻舟已过万重山,向前看,前路漫漫亦漫漫。
🍁🍁🍁那么我们下期再见!拜拜ヾ(•ω•`)o