map按值排序

注:

 1     //把map中的元素放到序列容器(如vector)中,然后再对这些元素进行排序
 2     // map是元素为pair,其已实现<操作符的重载
 3     template<class T1, class T2>
 4     inline bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y){
 5         return x.first < y.first   || (!(y.first < x.first) && x.second < y.second);
 6     }
 7     //x.first < y.first指键值小于的情况;
 8     //(!(y.first < x.first) && x.second < y.second);first键相等的情形下value的情况。
 9
10     // sort模版
11     template <class RandomAccessIterator>
12     void sort ( RandomAccessIterator first, RandomAccessIterator last );
13
14     template <class RandomAccessIterator, class Compare>
15     void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
16
17     //与map一样均可以指定比较的类。可以定义如下的比较的函数:
18     int cmp(const pair<string, int>& x, const pair<string, int>& y){
19         return x.second > y.second;
20     }
21     map<string,int> mp;
22     sort(vec.begin(),vec.end(),combyValue);

测试代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int cmp(const pair<string, int>& x, const pair<string, int>& y){
 4     return x.second > y.second;
 5 }
 6
 7 void cmpValue(map<string, int>& mp,vector<pair<string, int> >& vec)
 8 {
 9     for (map<string, int>::iterator iter = mp.begin(); iter != mp.end(); iter++)
10         vec.push_back(make_pair(iter->first, iter->second));//把map里面的值放进vector中
11     sort(vec.begin(), vec.end(), cmp);//然后对vector自定义排序 cmp
12 }
13 int main()
14 {
15     map<string, int> mp;
16     string word;
17     mp.insert({"abc",1});
18     mp.insert({"abcd",2});
19     mp.insert({"abce",3});
20     mp.insert({"abcf",4});
21     mp.insert({"abcd",5});
22     mp.insert({"abcs",7});
23     vector<pair<string,int> > vec;
24     cmpValue(mp,vec);
25     for(int i=0;i<(int)vec.size();i++)
26         cout<<vec[i].first<<": "<<vec[i].second<<endl;
27     return 0;
28 }

运行结果:

1 abcs: 7
2 abcf: 4
3 abce: 3
4 abcd: 2
5 abc: 1
12-23 04:22