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;
}

 

posted @ 2022-06-17 16:46  CRt0729  阅读(66)  评论(0编辑  收藏  举报