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