map按照value值排序
map可以实现key到value的一一映射,如果是一对多的,我们可以使用multimap
multimap<int,int>mp;
mp.insert(make_pair(first,second));
map默认是按照key值从小到大进行排序的,如果希望按照从大到小进行排序,可以使用
map<int,int,greater<int> >mp
如果我们期望按照自己定义的规则进行排序,那么可以自己写一个排序类
#include<iostream> #include<cstdio> #include<map> using namespace std; struct cmp { bool operator()(const string &k1,const string &k2) { return k1.length()<k2.length(); } }; int main() { map<string,int,cmp >mp; mp["abc"]=100; mp["a"]=15; mp["dfdsa"]=45; map<string,int>::iterator it; for(it=mp.begin();it!=mp.end();it++) cout<<it->first<<" "<<it->second<<endl; }
那要如何才能实现对value的排序呢?我们想到使用sort函数,但是sort函数只能对线性的容器进行排序,所以我们需要先把map转化成一个vector。map中的元素是一个pair
#include<iostream> #include<cstdio> #include<map> #include<vector> #include<algorithm> using namespace std; typedef pair<string,int>PAIR; bool cmp1(const PAIR &k1,const PAIR &k2) { return k1.second>k2.second; } struct cmp { bool operator()(const PAIR &k1,const PAIR &k2) { return k1.second>k2.second; } }; int main() { map<string,int>mp; mp["abc"]=100; mp["a"]=15; mp["dfdsa"]=45; vector<PAIR> v(mp.begin(),mp.end()); //sort(v.begin(),v.end(),cmp()); sort(v.begin(),v.end(),cmp1); for(int i=0;i<v.size();i++) cout<< v[i].first<<" "<<v[i].second <<endl; }