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