map排序

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;  
} 
posted @ 2019-08-22 18:13  dengshuo7412  阅读(575)  评论(0编辑  收藏  举报