博主简介:
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
 



















