好吧直接
bool cmp(pair<string, int> a, pair<string,int> b){
if(a.second!=b.second) return a.second>b.second;
else return a.first<b.first;
}
sort(vec.begin(),vec.end(),cmp);
就可以实现按词频递减,字典序递增
bool cmp(pair<string, int> a, pair<string, int> b){
return a.second>b.second;
}//按照int排序:从大到小
//复制代码,结合输出结果看
int main(){
vector<pair<string, int>> vec;
vec.push_back(make_pair("cb", 2));
vec.push_back(make_pair("de", 2));
vec.push_back(make_pair("abc", 1));
vec.push_back(make_pair("bcd", 2));
vec.push_back(make_pair("ef", 1));
vec.push_back(make_pair("gbcd", 2));
vec.push_back(make_pair("hbcd", 2));
vector<pair<string, int>> vec_copy(vec);//复制一个vec数组
//按照int从大到小排序,比较sort和stable_sort的结果
//sort是不稳定的
sort(vec.begin(),vec.end(),cmp);
cout<<"sort 不稳定"<<endl;
for(int i=0;i<vec.size();i++){
cout<<vec[i].first<<" "<<vec[i].second<<endl;
}
cout<<endl;
//stable_sort是稳定的
cout<<"sort 稳定"<<endl;
stable_sort(vec_copy.begin(), vec_copy.end(),cmp);
for(int i=0;i<vec_copy.size();i++){
cout<<vec_copy[i].first<<" "<<vec_copy[i].second<<endl;
}
cout<<endl;
//实现按词频递减,字典序递增
map<string,int> m;
m["cb"] = 2;
m["de"] = 2;
m["abc"]++;
m["bcd"] = 2;
m["ef"] = 1;
m["gbcd"] = 2;
m["hbcd"] = 2;
vector<pair<string,int>> vec1;
//将map中的元素转移到vec1中
map<string,int>::iterator iter;
for(iter=m.begin();iter!=m.end();iter++){
cout<<iter->first<<" "<<iter->second<<endl;
vec1.push_back(make_pair(iter->first, iter->second));
}
//map的顺序体现:vec1中的元素都是按string的字典序排列
cout<<endl;
cout<<"map中元素的排列"<<endl;
for(int i=0;i<vec1.size();i++){
cout<<vec1[i].first<<" "<<vec1[i].second<<endl;
}
cout<<endl;
//稳定排序:相同词频下,不改变原来的相对位置,所以同一个词频下,string按字典序递增排列
//所以vec1中的元素都是按词频递减,字典序递增
stable_sort(vec1.begin(),vec1.end(),cmp);
for(int i=0;i<vec1.size();i++){
cout<<vec1[i].first<<" "<<vec1[i].second<<endl;
}
cout<<endl;
return 0;
}