TZOJ 5373: C++实验:STL之map排序
描述
STL的map中存储了字符串以及对应出现的次数,请分别根据字符串顺序从小到大排序和出现次数从小到大排序。
部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码。
- C++
int main() { map<string, int> sm; int n; cin>>n; while(n--) { string s; int x; cin>>s>>x; sm[s] = x; } SortOutput(sm); return 0; }
输入
输入数据第一行为正整数n,接下来包含n行,每行一个字符串和出现的次数。
所有字符串和次数均不相同。
输出
分别按照字符串和出现次数排序,并输出map中的键和值,每行一对。
样例输入
5
abc 1
bcd 3
cde 2
def 5
efg 4
样例输出
abc 1
bcd 3
cde 2
def 5
efg 4
abc 1
cde 2
bcd 3
efg 4
def 5
AC感想:map的排序涉及到迭代器指针map<string,int> ::iterator it;看起来确实比较抽象,但是将这个理解为复杂版的int i;就行,还有关于键值对的it->first访问键和it->second访问值这两个也是全新的内容,需要多加熟悉;
最重点是map的内部是默认对键的大小进行从小到大的排序,是不能用sort的,而对于值进行排序可以用sort并用comp的自定义排序功能,也可以用库提供的less<int>();这个默认降序方法或greater<int>()这个升序方法;
并且,对值排序是需要把值装进一个vector的容器里进行排序,排完后先遍历整个vector,循环里再遍历整个map,如果遇到vector的第i个值和第it个键值对的值相等,那么就能找到对应的键,也就是it->first
#include<bits/stdc++.h> using namespace std; bool comp(int a,int b) { return a<b; } void SortOutput(map<string, int> &sm) { map<string,int> ::iterator it;//生成迭代器指针it vector <int> v; for(it = sm.begin();it!=sm.end();it++)//map使用迭代器循环所有元素方法,从开始begin到结束end { cout<<it->first<<" "<<it->second<<endl;//map内部默认升序排序,不能用sort v.push_back(it->second); } sort(v.begin(),v.end(),comp);//默认降序less,升序用greater<int>(); int n; for(int i=0;i<v.size();i++) { map<string,int>::iterator it; for(it=sm.begin();it!=sm.end();it++) { if(v[i]==it->second) cout<<it->first<<" "<<it->second<<endl;//it->first访问键,it->second访问值 } } } int main() { map<string, int> sm; int n; cin>>n; while(n--) { string s; int x; cin>>s>>x; sm[s] = x; } SortOutput(sm); return 0; }