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

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

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("\n");
    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\n",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\n",(*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\n",*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\n",*it);
    return 0 ;
}
 
相关文章
|
30天前
|
存储 JavaScript 前端开发
Set、Map、WeakSet 和 WeakMap 的区别
在 JavaScript 中,Set 和 Map 用于存储唯一值和键值对,支持多种操作方法,如添加、删除和检查元素。WeakSet 和 WeakMap 则存储弱引用的对象,有助于防止内存泄漏,适合特定场景使用。
|
2月前
|
存储 Java API
【数据结构】map&set详解
本文详细介绍了Java集合框架中的Set系列和Map系列集合。Set系列包括HashSet(哈希表实现,无序且元素唯一)、LinkedHashSet(保持插入顺序的HashSet)、TreeSet(红黑树实现,自动排序)。Map系列为双列集合,键值一一对应,键不可重复,值可重复。文章还介绍了HashMap、LinkedHashMap、TreeMap的具体实现与应用场景,并提供了面试题示例,如随机链表复制、宝石与石头、前K个高频单词等问题的解决方案。
35 6
【数据结构】map&set详解
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
31 1
|
2月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
35 5
|
2月前
|
存储 JavaScript 前端开发
js的map和set |21
js的map和set |21
|
2月前
|
数据处理 Python
Pandas中的map函数应用
Pandas中的map函数应用
18 2
|
2月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
WK
|
2月前
|
Python
map函数
在Python中,`map()` 是一个内置的高阶函数,接受一个函数和一个或多个可迭代对象作为参数,将指定函数应用于每个元素,并返回包含应用结果的迭代器。若有多个可迭代对象,其元素会并行地传递给函数。`map()` 返回一个迭代器,需用 `list()` 转换。在Python 3中,`map()` 返回迭代器而非列表,并支持 `lambda` 表达式,适用于多种应用场景。注意,当输入的可迭代对象长度不同时,结果仅包含最短对象的长度。
WK
26 1
|
2月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
1月前
|
存储 分布式计算 Java
Stream很好,Map很酷,但答应我别用toMap():Java开发中的高效集合操作
在Java的世界里,Stream API和Map集合无疑是两大强大的工具,它们极大地简化了数据处理和集合操作的复杂度。然而,在享受这些便利的同时,我们也应当警惕一些潜在的陷阱,尤其是当Stream与Map结合使用时。本文将深入探讨Stream与Map的优雅用法,并特别指出在使用toMap()方法时需要注意的问题,旨在帮助大家在工作中更高效、更安全地使用这些技术。
36 0