C++的优先队列priority_queue如何自定义排序

在C++中,std::priority_queue 是一个容器适配器,默认情况下它是一个最大堆,即队列顶部的元素是最大的,如果想自定义排序规则,可以通过提供一个自定义的比较函数或函数对象来实现

目录

仿函数

lambda表达式

 std::greater 或 std::less


仿函数

仿函数就是一个重载了括号运算符的结构体或者类

#include <iostream>
#include <queue>
#include <vector>

// 自定义比较函数
struct Compare {
    bool operator()(int a, int b) {
        return a > b; // 最小堆
    }
};

int main() {
    // 使用自定义比较函数声明优先队列
    std::priority_queue<int, std::vector<int>, Compare> minHeap;

    minHeap.push(3);

    while (!minHeap.empty()) {
        std::cout << minHeap.top() << " ";
        minHeap.pop();
    }

    return 0;
}

lambda表达式

decltype(cmp) 用于获取 Lambda 表达式的类型

#include <iostream>
#include <queue>
#include <vector>

int main() {
    // 使用 Lambda 表达式作为比较函数
    auto cmp = [](int a, int b) { return a > b; };
    std::priority_queue<int, std::vector<int>, decltype(cmp)> minHeap(cmp);

    minHeap.push(4);

    while (!minHeap.empty()) {
        std::cout << minHeap.top() << " ";
        minHeap.pop();
    }

    return 0;
}

还可以这样写,std::function 是一个通用的可调用类型包装器,可以封装任何类型的可调用对象(包括函数、Lambda、函数对象等)

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int main() {
    // 使用 Lambda 表达式作为比较器
    priority_queue<int, vector<int>, function<bool(int, int)>> pq(
        [](int a, int b) { return a > b; }  // 按升序排列(最小堆)
    );
    
    pq.push(5);
    
    // 输出队列中的元素
    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    // 输出: 5 10 20 30  (按升序排列)
    
    return 0;
}

 std::greater 或 std::less

可以使用标准库中的比较函数对象,std::greater<int> 使得 priority_queue 成为一个最小堆,意思是元素越来越大

#include <iostream>
#include <queue>
#include <vector>
#include <functional> // 包含 std::greater

int main() {
    // 使用 std::greater 作为比较函数
    std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;

    minHeap.push(4);

    while (!minHeap.empty()) {
        std::cout << minHeap.top() << " ";
        minHeap.pop();
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员萌芽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值