c++优先队列priority_queue(自定义比较函数)

简介: c++优先队列priority_queue(自定义比较函数)


可以使用现成的

less来定义大顶堆

greater来定义小顶堆

从文档出可以看到,传入的可以是 函数指针或者 函数对象(类对操作符()进行了重载,)

参考链接:函数指针和函数对象

参考链接:decltype

方式一:struct重载运算符()

通过struct重载()操作符,定义了一个函数对象

struct cmp{
   bool operator()(vector<int>&a,vector<int>&b){
       return a[0]>b[0]; 
   }
};
priority_queue<vector<int>,vector<vector<int>>,cmp> q;//小顶堆

这是属于传入 函数对象 的方式

方式二:class重载运算符()

通过class重载()操作符,定义了一个函数对象

注意要加public

class cmp{
public:
    bool operator()(vector<int>&a,vector<int>&b){
        return a[0]>b[0]; 
    }
};
priority_queue<vector<int>,vector<vector<int>>,cmp> q;//小顶堆

这是属于传入 函数对象 的方式

方式三:定义函数

首先定义一个比较函数

bool cmp(vector<int>&a,vector<int>&b){
  return a[0]>b[0];
}

decltype()是用于获得函数指针的 类型的。在模板中也要传入它们的类型。

decltype()要传入的是一个对象的地址,因此需要对cmp加取值符,&cmp为对象的地址

因此可以由函数地址cmp 转为函数指针 类型 decltype(&cmp)

priority_queue<vector<int>,vector<vector<int>>,decltype(&cmp)> q(cmp);//小顶堆

写法一:

写法二:

如果作为类成员函数,一定要声明static

这是属于传入 函数指针的方式。

方式四:lambda表达式

auto cmp=[](vector<int>&a,vector<int>&b)->bool{
            return a[0]>b[0];
        };
priority_queue<vector<int>,vector<vector<int>>,decltype(cmp)> q(cmp);//小顶堆

这是属于传入 函数指针的方式。

方式五:function包装lambda表达式

要加入头文件#include

由于function对lambda函数进行了包装 ,cmp本身就是一个对象地址。(function对象)

直接decltype(cmp)获得函数指针 的类型。

function<bool(vector<int>&,vector<int>&)> cmp=[](vector<int>&a,vector<int>&b)->bool{
            return a[0]>b[0];
        };
priority_queue<vector<int>,vector<vector<int>>,decltype(cmp)> q(cmp);//小顶堆

这是属于传入 函数指针的方式。

测试用例

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main(){
    auto cmp=[](vector<int>&a,vector<int>&b)->bool{
            return a[0]>b[0];
        };
    priority_queue<vector<int>,vector<vector<int>>,decltype(cmp)> q(cmp);//小顶堆
    q.push({3,4});
    q.push({1,2});
    q.push({5,6});
    vector<int> vec=q.top();
    q.pop();
    cout<<vec[0]<<endl;
    cout<<vec[1]<<endl;
    system("pause");
    return 0;
}

输出结果


相关文章
|
3月前
|
C++
C++ PCL 沿着自定义的平面做横截面(直通滤波)
C++ PCL 沿着自定义的平面做横截面(直通滤波)
44 0
|
27天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
45 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
23 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
154 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
30 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
22 3
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法