循环读入字符,将字符存入map中,键为字符,值为次数,当遇到回车时进行输出,输出要进行排序,由于map不能直接进行sort,故将map中的数据填充到vector中用sort进行排序,排序逻辑由自定义排序cmp函数实现

#include <stdio.h>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

bool cmp(pair<char,int> left, pair<char,int> right)
{
    //次数相同的情况下,比较字符;
    if(left.second == right.second)
        return left.first < right.first;

    //次数不同的情况下,比较次数;
    return left.second > right.second;
}

int main()
{

    char ch;
    map<char,int> m_map;
    while(scanf("%c",&ch) != EOF)
    {
        //遇到回车则输出结果;
        if(ch == '\n')
        {
            //将map中的数据填入vector中;
            vector<pair<char, int> > m_vec;
            map<char,int>::iterator iter = m_map.begin();
            for(;iter!=m_map.end();iter++)
            {
                m_vec.push_back(make_pair(iter->first, iter->second));
            }
            //使用sort对vector进行排序,cmp是自定义的排序逻辑;
            sort(m_vec.begin(), m_vec.end(), cmp);

            //输出;
            for(auto& o: m_vec)
            {
                printf("%c", o);
            }
            //每次输出都要换行;
            printf("\n");
            //每次输出完成后重置map;
            m_map.clear();
        }
        else
        {
            //如果已经存储了则次数加1;
            map<char,int>::iterator iter = m_map.find(ch);
            if(iter != m_map.end())
            {
                iter->second++;
            }
            else
            {
                //第一次将次数置1;
                m_map[ch] = 1;
            }
        }
    }
    return 0;
}