STLmap实现自定义排序
1.map按照键值 key进行排序
map没有随机迭代器,只有顺序迭代器,不能使用sort
- 默认情况下是按照 less
升序排列
// map的原始定义 template< class Key, class T, class Compare = std::less<Key>, class Allocator = std::allocator<std::pair<const Key, T> > > class map; namespace pmr { template <class Key, class T, class Compare = std::less<Key>> using map = std::map<Key, T, Compare, std::pmr::polymorphic_allocator<std::pair<const Key,T>>> } #include<iostream> #include<map> using namespace std; int main() { srand((unsigned)time(NULL)); multimap<int,int>mp; // multimap第三个参数默认为less<Key>,即 less<int> int n; cin>>n; int a,b; for(int i=0; i<n; i++) { a=rand()%4; b=rand()%4; //插入 mp.insert(make_pair<int,int>(a,b)); // pair也可以 } map<int,int>::iterator iter; //遍历输出 for(iter=mp.begin(); iter!=mp.end(); iter++) cout<<iter->first<<" "<<iter->second<<endl; return 0; }
- 输出结果
输入8,Key升序,Value随机: 1 1 1 1 1 2 2 1 3 3 3 0 3 3 3 2
定义map时,用greater< Key>实现按Key值递减插入数据
multimap<int,int,greater<int> >mp; //注意<int>后空一格 // 自定义key 仿函数,或者lambda表达式 #include<iostream> #include<map> using namespace std; typedef struct tagIntPlus { int num,i; }IntPlus; //自定义比较规则 //注意operator是(),不是< struct Cmp { bool operator () (IntPlus const &a,IntPlus const &b)const { if(a.num!=b.num) return a.num<b.num; else return a.i<b.i; } }; int main() { srand((unsigned)time(NULL)); //注意此处一定要有Cmp,否则无法排序会报错 multimap<IntPlus,int,Cmp>mp; int n; cin>>n; int a,b; IntPlus intplus; for(int i=0; i<n; i++) { a=rand()%4; b=rand()%4; intplus.num=a; intplus.i=b; mp.insert(pair<IntPlus,int>(intplus,i)); } map<IntPlus,int>::iterator iter; for(iter=mp.begin(); iter!=mp.end(); iter++) cout<<iter->first.num<<" "<<iter->first.i<<" "<<iter->second<<endl; return 0; }
2.map按照键值 value 进行排序
可以把map中的key值和value值分别转存到一个pair类型的vector中,在对vector按照一定的规则排序即可。
这样的方法对值一样的情况也能够使用。
//功能:输入单词,统计单词出现次数并按照单词出现次数从多到少排序 #include <iostream> #include <cstdlib> #include <map> #include <vector> #include <string> #include <algorithm> using namespace std; int cmp(const pair<string, int>& x, const pair<string, int>& y) { return x.second > y.second; } void sortMapByValue(map<string, int>& tMap,vector<pair<string, int> >& tVector) { for (map<string, int>::iterator curr = tMap.begin(); curr != tMap.end(); curr++) tVector.push_back(make_pair(curr->first, curr->second)); sort(tVector.begin(), tVector.end(), cmp); } int main() { map<string, int> tMap; string word; while (cin >> word) { pair<map<string,int>::iterator,bool> ret = tMap.insert(make_pair(word, 1)); if (!ret.second) ++ret.first->second; } vector<pair<string,int>> tVector; sortMapByValue(tMap,tVector); for(int i=0;i<tVector.size();i++) cout<<tVector[i].first<<": "<<tVector[i].second<<endl; system("pause"); return 0; }