循环读入字符,将字符存入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;
}
京公网安备 11010502036488号