帶索引的排序可以轉化成一下幾步:
- 先將(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;
}