循环读入字符,将字符存入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; }