• STL中sort、priority_queue、map、set的自定义比较函数


    STL中,sort的默认排序为less,也就是说从小到大排序;priority_queue默认是less,也就说大顶堆;map默认是less,也就说用迭代器迭代的时候默认是小的排在前面;set默认是less,也就是说用迭代器迭代的时候是从小到大排序的。

    1、sort

    #include <stdio.h>
    #include <algorithm>
    #include <functional>
    using namespace std;
    
    bool comp(const int& a, const int& b ){
        return a < b ; //从小到大
    }
    struct cmp{
        bool operator()( const int& a , const int& b ) const{
            return a < b ;      //从小到大
        }
    } ;
    
    int main(){
        int array[] = {1 ,5 ,4, 10 , 3, 6 }  ;
        sort( array , array+6 ) ; //以默认的less<int>()排序
        sort( array , array+6 , greater<int>() ) ;  //从大到小排序
        sort( array , array+6 , comp ) ;
        sort( array , array+6 , cmp() ) ;//使用仿函数
        for(int i=0;i<6;++i)    printf("%d ",array[i]); printf("
    ");
        return 0 ;
    }
    

    2、priority_queue

    #include <stdio.h>
    #include <queue>
    using namespace std ;
    
    struct cmp{
        bool operator()( const int& a , const int& b )const{
            return a < b ;      //大顶堆
        }
    };
    struct Node{
        int x, y ;
        Node(int _x, int _y ):x(_x),y(_y){}
        bool operator <(const Node& n1)const{
            if( x < n1.x )    return true ;     //按照x为第一关键字由大到小排序
            else if( x == n1.x )   return y < n1.y  ;   //y为第二关键字由大到小排序
            else    return false ;
        }
    } ;
    
    int main(){
        //priority_queue<int> q ; //优先队列默认是less,大顶堆 ;
        //priority_queue<int,vector<int> ,cmp> q ;
        priority_queue< Node > q ;
    
        for(int i=0;i<10;i++)   q.push( Node( rand() , rand() ) );
        while( !q.empty() ){
            printf("%d %d
    ",q.top().x , q.top().y ) ;
            q.pop() ;
        }
        return 0 ;
    }
    还可以在构造函数中进行比较运算符的初始化。
    例如:
    #include<queue>
    #include<vector>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    //小根堆
    bool cmp(int a,int b) { return a>b; } int main() { int ia[9]={0,1,2,3,4,8,9,3,5}; priority_queue<int,vector<int>,bool (*)(int,int)> ipq(ia,ia+9,cmp); //默认参数要从左到右开始指定 cout<<"size=" <<ipq.size()<<endl; for(int i=0;i<ipq.size();++i) cout<<ipq.top()<<' '; cout<<endl; while(!ipq.empty()) { cout<<ipq.top()<<' '; ipq.pop(); } cout<<endl; }

    3、map

     

    #include<stdio.h>
    #include <map>
    using namespace std;
    
    struct cmp{
        bool operator()( const int& a, const int& b ) const{
            return a < b ; //从小到大;
        }
    };
    int main(){
        //map<int, int,greater<int> > mp ;  //从大到小
        map<int , int ,cmp> mp ;
        for(int i=0;i<10;++i)   mp.insert( map<int,int,cmp >::value_type(rand() ,i) ) ;
        map<int, int, cmp >::iterator it = mp.begin() ;
        for( ;it!=mp.end() ;it++)   printf("%d %d
    ",(*it).first , (*it).second );
        return 0 ;
    }
    

     

    4、set

    #include <stdio.h>
    #include <iostream>
    #include <algorithm>
    #include <set>
    
    using namespace std;
    
    struct cmp{
        bool operator()( const int& a , const int& b )const{
            return a < b ; //从小到大
        }
    } ;
    
    int main(){
        //set<int > s ;
        set<int,cmp> s ;
        for(int i=0;i<10;i++)   s.insert( rand() ) ;
        set<int,cmp>::iterator it = s.begin() ;
        for( ; it!=s.end();it++)
            printf("%d
    ",*it);
        return 0 ;
    }
    令一种比较函数的声明方式,在构造函数中初始化:
    #include <stdio.h>
    #include <iostream>
    #include <algorithm>
    #include <set>
    
    using namespace std;
    
    struct cmp{
        bool operator()( const int& a , const int& b )const{
            return a < b ; //从小到大
        }
    } ;
    bool mycmp(int a,int b)
    {
        return a<b;
    }
    int main(){
        //set<int > s ;
        set<int,decltype(mycmp)*> s(mycmp) ;
        for(int i=0;i<10;i++)   s.insert( rand() ) ;
        set<int,cmp>::iterator it = s.begin() ;
        for( ; it!=s.end();it++)
            printf("%d
    ",*it);
        return 0 ;
    }
     
  • 相关阅读:
    SpringMVC框架学习笔记(一)
    Spring框架学习笔记(四)
    Spring框架学习笔记(三)
    Spring框架学习笔记(二)
    Spring框架学习笔记(一)
    单点登录与权限管理本质:cookie安全问题
    单点登录与权限管理本质:单点登录介绍
    单点登录与权限管理本质:HTTP重定向
    单点登录与权限管理本质:session和cookie介绍
    「单点登录与权限管理」系列概述
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4409382.html
Copyright © 2020-2023  润新知