给小班讲stl 之 map、sort、优先队列
引子:最近老师让给小班讲课,讲stl,,但是我觉得就小班现在这水平根本讲不懂好不好,,,,😒😒不开心
首先,经过我的各种脑补到我讲课的时候讲台下一脸蒙蔽的场景后我该怎么解决,我就出了一道非常简单非常简单的题来辅助我教他们理解这几个stl,,题目如下(小班的同志们如果看到我的这篇博客请去洛谷团队里测那道题)
T810 学长讲stl之练习一
或者也可以扫描以下二维码查看题目:
题目背景
有一帮正在学习stl的53级小学生和*******(mdzz)....................
题目描述:
输入字符串和对应数字
按照字符串优先级顺序输出字符串所对应的数字
例:
adc 4
adc 100
abc 5
bcd 2
那么输出结果为:
5
100
2
输入输出格式:
输入格式:
第一行一个输入总数x
剩下x行输入一个字符串、空格和一个数字
输出格式:
按照字符串优先值排序的字符串所对应的数字
如果输入字符串有重复,那就输出 输入顺序靠后的那个所对应的数字
输入输出样例:
输入样例#1:
4 map 2 lcez 1 hahaha 3 hahalidaxin 250
输出样例#1:
3 250 1 2
说明:
x<=200
字符串长度<=100
数字大小范围为int的大小范围
如果都不懂题那就回去看题目描述,,,(ps:你们帅(diao)气(si)的王学长赠言)
大约就是这个样子,,非常非常简单非常非常简单,,,,,
1.如果是用map 的话,那就直接每输入一个字符串和数就把这个字符串和数关联起来,最后用迭代器直接遍历得到的就是正确答案;
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* *language c++ *stl:map */ #include<iostream> #include<map> using namespace std; int main(){ int n; map<string, int> mapa; cin>>n; for(int i = 0; i < n; i++){ int shuzi; string zifuchuan; cin >> zifuchuan >> shuzi; mapa[zifuchuan] = shuzi; } for(map<string,int>::iterator it = mapa.begin(); it != mapa.end(); it++){ cout << it->second << endl; } return 0; }
2.如果是用sort 的话,那就建立一个结构体,结构体里放字符串和数字,然后自己写一个排序函数(我之前一篇博客里有讲),直接sort就可以了;
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* *language c++ *stl:sort */ #include<iostream> #include<algorithm> using namespace std; struct Nodea{ string zifuchuan; int shuzi; }; bool paixu(const Nodea &x,const Nodea &y){ return x.zifuchuan < y.zifuchuan; } int main() { Nodea node[201]; int n;cin>>n; for(int i = 0; i < n; i++){ cin>>node[i].zifuchuan>>node[i].shuzi; } sort(node+0,node+n,paixu); for(int i = 0; i <n; i++){ cout << node[i].shuzi << endl; } return 0; }
3.如果是用优先队列的话,那就也是建立一个结构体,结构体重载 '<'这个运算符,返回字符串比较的结果,然后把结构体放到优先队列里,再遍历优先队列就是正确结果了。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* *language c++ *stl:优先队列 */ #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct Nodea{ friend bool operator < (Nodea n1, Nodea n2){ return n1.zifuchuan > n2.zifuchuan; } string zifuchuan; int shuzi; }; priority_queue<Nodea> qn; int main(){ int n;cin>>n; Nodea node[n]; for(int i = 0; i < n; i++){ cin>>node[i].zifuchuan>>node[i].shuzi; qn.push(node[i]); } for(int i = 0; i < n; i++){ cout<<qn.top().shuzi<<endl; qn.pop(); } }
好了,这就完事了,三种stl的简单应用一次讲完... ...
(我的代码好丑。。。)
最后附上我找到别人讲stl的精彩博客:
sort:http://blog.csdn.net/zzzmmmkkk/article/details/4266888/
string:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html
还有我强烈抗议奥赛室里那个专门对着我的摄像头,,该拍的人不拍,我换了位置还又加一个专门拍我的?!