全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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();
}

自定义类型与比较函数

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

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),而构建过程类似于堆排序中的建堆阶段。

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

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

这正是 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 编码、任务调度等需要优先处理最大/最小元素的场合。


# go  # 编码  # ai  # c++  # ios  # stream  # 标准库  # 结构体  # 接口  #   # 对象  # 算法  # 自定义  # 适用于  # 弹出  # 都是  # 是一个  # 如果你  # 可以说  # 均为  # 有所不同  # 可以通过 


相关文章: 北京网站制作网页,网站升级改版需要多久?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  如何规划企业建站流程的关键步骤?  建站之星后台密码遗忘?如何快速找回?  网站制作公司排行榜,抖音怎样做个人官方网站  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  建站DNS解析失败?如何正确配置域名服务器?  大连网站设计制作招聘信息,大连投诉网站有哪些?  如何通过主机屋免费建站教程十分钟搭建网站?  ,购物网站怎么盈利呢?  如何在腾讯云免费申请建站?  如何在阿里云部署织梦网站?  如何用wdcp快速搭建高效网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在阿里云购买域名并搭建网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  图册素材网站设计制作软件,图册的导出方式有几种?  如何高效完成自助建站业务培训?  如何快速打造个性化非模板自助建站?  网站制作壁纸教程视频,电脑壁纸网站?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  青浦网站制作公司有哪些,苹果官网发货地是哪里?  如何基于PHP生成高效IDC网络公司建站源码?  如何选择高性价比服务器搭建个人网站?  建站之星多图banner生成与模板自定义指南  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在宝塔面板中修改默认建站目录?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  如何确认建站备案号应放置的具体位置?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何通过云梦建站系统实现SEO快速优化?  如何通过老薛主机一键快速建站?  网站制作话术技巧,网站推广做的好怎么话术?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  专业网站建设制作报价,网页设计制作要考什么证?  如何在宝塔面板创建新站点?  代购小票制作网站有哪些,购物小票的简要说明?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何通过万网虚拟主机快速搭建网站?  建站与域名管理如何高效结合?  如何在景安服务器上快速搭建个人网站?  制作网站怎么制作,*游戏网站怎么搭建?  如何快速配置高效服务器建站软件?  创业网站制作流程,创业网站可靠吗?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  如何在阿里云服务器自主搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。