map按键排序

map按键排序

1 //按键排序:
2 map<string,int> mp;//从小到大排序
3 map<string,int,less<string> > mps;//从小到大排序
4 map<string,int,greater<string> >maps;//从大到小排序
5 map<string,int,cmp> mapc;//自定义排序,cmp为结构体

注:

 1     //map内部本身就是按序存储的(比如红黑树)
 2     //插入<key, value>键值对时,就会按照key的大小顺序进行存储,其中key的类型必须能够进行 < 运算,且唯一
 3 
 4  //   map的模板定义如下
 5     template < class Key, class T, class Compare = less<Key>,class Allocator = allocator<pair<const Key,T> > > class map;
 6 
 7  //第三、四个均包含默认参数,可以不指定。我们可以通过指定Compare类来指定排序的顺序。
 8  //其中less<Key>是stl里面的一个函数对象(即调用操作符的类,其对象常称为函数对象(function object)
 9  //它们是行为类似函数的对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类,
10 
11    //其实质是对operator()操作符的重载
12 
13   //是一个带模板的struct,对()运算符进行了重载。
14 
15     //从小到大 map<string,int,less<string> >
16     template <class T> struct less : binary_function <T,T,bool>{
17         bool operator() (const T& x, const T& y) const{
18             return x<y;
19         }
20     };
21 
22    //从大到小 map<string,int,greater<string> >
23     template <class T> struct greater : binary_function <T,T,bool>{
24         bool operator() (const T& x, const T& y) const{
25             return x>y;
26         }
27     };
28 
29     //3自定义排序:
30     struct cmp{
31         bool operator()(const string& x,const string &y ){
32             return x.length()>y.length();
33         }
34     }
35     map<string,int,cmp> mp;

测试代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct cmp{
 4     bool operator()(const string& x,const string &y ){
 5         return x.length()>y.length();
 6     }
 7 };
 8 void display(map<string,int>& mp)
 9 {
10     map<string,int>::iterator iter=mp.begin();
11     while(iter!=mp.end())
12     {
13         cout<<iter->first<<" "<<iter->second<<endl;
14         iter++;
15     }
16     cout<<endl;
17 }
18 void display(map<string,int,greater<string> >& mp)
19 {
20     map<string,int,greater<string> >::iterator iter=mp.begin();
21     while(iter!=mp.end())
22     {
23         cout<<iter->first<<" "<<iter->second<<endl;
24         iter++;
25     }
26     cout<<endl;
27 }
28 void display(  map<string,int,cmp> & mp)
29 {
30      map<string,int,cmp> ::iterator iter=mp.begin();
31     while(iter!=mp.end())
32     {
33         cout<<iter->first<<" "<<iter->second<<endl;
34         iter++;
35     }
36     cout<<endl;
37 }
38 
39 int main()
40 {
41     //按键排序:
42     //从小到大排序
43     map<string,int> mp;
44 
45     mp.insert({"abc",1});//使用{}
46     mp.insert({"zbc",4});//使用{}
47     mp.insert({"bbc",3});//使用{}
48     mp.insert({"kbc",2});//使用{}
49     mp.insert({"fbc",6});//使用{}
50     mp.insert({"ebc",0});//使用{}
51 
52     //从小到大排序,mp默认从小到大,不能初始化从大到小的key排序
53     map<string,int,less<string> > mps(mp);
54     display(mp);
55     display(mps);
56 
57     //从大到小排序
58     map<string,int,greater<string> > maps;
59     maps.insert({"ad",1});
60     maps.insert({"d",2});
61     maps.insert({"f",4});
62     maps.insert({"ss",7});
63     maps.insert({"z",8});
64     display(maps);
65 
66     //自定义排序,cmp为结构体  按字符串的长度排序
67     map<string,int,cmp>  mapc;
68     mapc.insert({"ad",1});
69     mapc.insert({"dssss",2});
70     mapc.insert({"fss",4});
71     mapc.insert({"ss",7});
72     mapc.insert({"z",8});
73     display(mapc);
74     return 0;
75 }

运行结果:

 1 abc 1
 2 bbc 3
 3 ebc 0
 4 fbc 6
 5 kbc 2
 6 zbc 4
 7 
 8 abc 1
 9 bbc 3
10 ebc 0
11 fbc 6
12 kbc 2
13 zbc 4
14 
15 z 8
16 ss 7
17 f 4
18 d 2
19 ad 1
20 
21 dssss 2
22 fss 4
23 ad 1
24 z 8
原文地址:https://www.cnblogs.com/NirobertEinteson/p/11967672.html