带索引的排序可以转化成一下几步:
- 先将(index,value)按照map中(key, value)的方法,存入map中;
- 再将map中的(key, value)拷贝入vector<pair<type_key, type_value>> 中;
- 然后自定义编写写stable_sort()函数中的cmp;
- 按照你需要的排序方法去定义cmp即可;
例如:如果统计的个数相同,则按照ASCII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
static bool is_bigger(const pair<char, int>& left, const pair<char, int>& right){
return left.second > right.second;
}
int main(){
string str;
while(cin >> str){
//map默认按照字典序进行排列的
map<char, int> mm; //mm初始话value为0
for(auto c : str){
if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
(c >= '0' && c <= '9') || c == ' '){
mm[c]++;
}
}
//利用拷贝初始化将map中的key-vaule对复制到vector中
//因为sort()排序只针对线性序列容器
vector<pair<char, int>> vec(mm.begin(), mm.end());
//sort()排序是不稳定的,也就是说不能保证相对大小的顺序
stable_sort(vec.begin(), vec.end(), is_bigger);
for(auto &c : vec){
cout << c.first;
}
cout << endl;
}
return 0;
}