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;
}