• 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;  
    } 
    
  • 相关阅读:
    MongoDB数据创建与使用
    python库安装方法及下载依赖库
    java开发基础知识学习
    wifi破解基础及工具的使用
    Markdonw基本语法学习
    toj 4353 Estimation(树状数组+二分查找)
    POJ 1694 An Old Stone Game【递归+排序】
    POJ 2092 Grandpa is Famous【水---找出现第二多的数】
    POJ 2993 Emag eht htiw Em Pleh【模拟画棋盘】
    POJ 1068 Parencodings【水模拟--数括号】
  • 原文地址:https://www.cnblogs.com/GeekDanny/p/11396028.html
Copyright © 2020-2023  润新知