0

0

c++的std::priority_queue如何使用_c++优先队列与堆排序

穿越時空

穿越時空

发布时间:2025-12-27 16:17:08

|

833人浏览过

|

来源于php中文网

原创

std::priority_queue是C++中基于堆的容器适配器,默认实现大顶堆,可通过指定比较函数如std::greater构建小顶堆,支持自定义类型与比较规则,底层利用堆算法维护堆序,插入和弹出时间复杂度均为O(log n),其行为类似堆排序中的动态维护过程,提供高效的最大(或最小)元素访问,适用于任务调度、Dijkstra等需优先处理极值的场景。

c++的std::priority_queue如何使用_c++优先队列与堆排序

std::priority_queue 是 C++ 标准库中一个基于堆(heap)实现的容器适配器,常用于快速获取最大(或最小)元素。它底层通常使用 std::vector 或 std::deque,并通过堆算法维护堆序性质。它和堆排序有密切关系,但用途和行为有所不同。

基本用法:默认是大顶堆

默认情况下,std::priority_queue 是一个大顶堆,即每次 top() 返回当前最大值。

#include 
#include 

int main() {
    std::priority_queue pq;
    pq.push(3);
    pq.push(1);
    pq.push(4);
    pq.push(2);

    while (!pq.empty()) {
        std::cout << pq.top() << " ";  // 输出: 4 3 2 1
        pq.pop();
    }
}

如何创建小顶堆

通过指定比较函数对象来改变排序规则。例如,使用 std::greater 实现小顶堆。

#include 
#include 
#include   // std::greater

std::priority_queue, std::greater> min_pq;
min_pq.push(3);
min_pq.push(1);
min_pq.push(4);
min_pq.push(2);

while (!min_pq.empty()) {
    std::cout << min_pq.top() << " ";  // 输出: 1 2 3 4
    min_pq.pop();
}

自定义类型与比较函数

对于结构体或类,需要提供比较方式。可以通过重载操作符或传入仿函数。

立即学习C++免费学习笔记(深入)”;

struct Task {
    int priority;
    std::string name;
};

// 自定义比较:优先级数值越小,优先级越高(用于小顶堆)
struct CompareTask {
    bool operator()(const Task& a, const Task& b) {
        return a.priority > b.priority;  // 注意:这里 > 表示更小的优先级先出
    }
};

std::priority_queue, CompareTask> task_queue;
task_queue.push({2, "Low"});
task_queue.push({1, "High"});
task_queue.push({3, "Normal"});

while (!task_queue.empty()) {
    std::cout << task_queue.top().name << " ";
    task_queue.pop();
}
// 输出: High Low Normal

priority_queue 与堆排序的关系

std::priority_queue 的内部实现依赖于堆结构,插入(push)和弹出(pop)操作的时间复杂度都是 O(log n),而构建过程类似于堆排序中的建堆阶段。

Explainpaper
Explainpaper

阅读学术论文的更好方法,你的学术论文阅读助手。

下载

堆排序的过程可以看作是:

  • 将数组调整为堆(建堆)
  • 反复取出堆顶并调整剩余元素

这正是 priority_queue 在背后做的事。如果你手动对一个 vector 使用 std::make_heap、std::push_heap 和 std::pop_heap,就相当于实现了 priority_queue 的功能。

#include 
#include 
#include 

std::vector v = {3, 1, 4, 2};
std::make_heap(v.begin(), v.end());  // 建大顶堆

while (!v.empty()) {
    std::cout << v.front() << " ";   // 输出最大值
    std::pop_heap(v.begin(), v.end()); // 将最大移到末尾
    v.pop_back();                      // 移除末尾
}
// 输出: 4 3 2 1

可以看到,这个过程和 priority_queue 的行为一致。因此可以说,priority_queue 提供了堆排序中“动态维护堆”的抽象接口,适合在运行时不断插入删除的场景。

基本上就这些。std::priority_queue 简化了堆的操作,避免手动调用堆算法,适用于 Dijkstra、Huffman 编码、任务调度等需要优先处理最大/最小元素的场合。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

184

2025.07.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

985

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

41

2025.10.17

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

363

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

558

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

383

2023.08.14

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

35

2025.12.26

压缩文件加密教程汇总
压缩文件加密教程汇总

本专题整合了压缩文件加密教程,阅读专题下面的文章了解更多详细教程。

18

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号