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;

}

 

posted @ 2018-03-13 19:08  blueattack  阅读(6007)  评论(0编辑  收藏  举报