map排序

Posted geekdanny

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;  
 

以上是关于map排序的主要内容,如果未能解决你的问题,请参考以下文章

python map按value排序

如何禁止STL map 自动排序

c++ map基础知识、按键排序、按值排序

golang语言map的并发和排序

Java中如何对Map的value或者key排序

map的默认排序和自定义排序