全网整合营销服务商

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

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

c++怎么实现一个优先队列_c++优先队列(priority_queue)的原理与实现

C++中priority_queue是基于堆的容器适配器,默认为大顶堆,自动排序并优先弹出最大值;通过std::greater可改为小顶堆;底层使用vector存储,借助push_heap和pop_heap维护堆性质;支持自定义类型,需重载operator

在C++中,priority_queue 是一个基于堆(heap)实现的容器适配器,能够自动将元素按照优先级排序,默认是大顶堆(最大值优先)。它并不像普通队列那样遵循先进先出原则,而是每次取出当前优先级最高的元素。

priority_queue 的基本用法

在 C++ 标准库中,priority_queue 定义在 头文件中。使用方式如下:

默认大顶堆(最大值优先):

#include 
#include 

std::priority_queue pq; pq.push(10); pq.push(30); pq.push(20); while (!pq.empty()) { std::cout << pq.top() << " "; // 输出:30 20 10 pq.pop(); }

小顶堆(最小值优先):

std::priority_queue, std::greater> pq;

这里第三个模板参数指定比较函数对象,使用 std::greater 实现升序,即最小值在 top。

priority_queue 的底层原理

priority_queue 实际上是一个堆结构的封装,通常基于完全二叉树,使用数组(如 vector)存储。其核心操作依赖于两个算法:

  • 向上调整(push_heap):插入新元素后,从底部向上调整以维持堆性质。
  • 向下调整(pop_heap):删除堆顶后,将最后一个元素移到顶部,再向下调整。

这些操作的时间复杂度为 O(log n),而访问堆顶是 O(1)。

C++ STL 中的 priority_queue 默认使用 std::vector 作为底层容器,并通过 std::make_heap、std::push_heap、std::pop_heap 等函数维护堆结构。

自定义数据类型的优先队列

如果要存储自定义类型(如结构体),需要提供比较逻辑。有两种方式:

方法一:重载 operator

struct Person {
    int age;
    std::string name;
    // 重载小于号,用于大顶堆(年龄大的优先)
    bool operator<(const Person& p) const {
        return age < p.age;
    }
};
std::priority_queue pq;

方法二:自定义比较结构体

struct Compare {
    bool operator()(const Person& a, const Person& b) {
        return a.age < b.age;  // 大顶堆
    }
};
std::priority_queue, Compare> pq;

手动实现一个简单的优先队列

虽然标准库提供了 priority_queue,但理解其手动实现有助于掌握原理。以下是一个简化版的大顶堆实现:

#include 
#include 

class MaxPriorityQueue { private: std::vector heap;

void sift_up(int idx) {
    while (idx youjiankuohaophpcn 0) {
        int parent = (idx - 1) / 2;
        if (heap[idx] zuojiankuohaophpcn= heap[parent]) break;
        std::swap(heap[idx], heap[parent]);
        idx = parent;
    }
}

void sift_down(int idx) {
    int n = heap.size();
    while (idx zuojiankuohaophpcn n) {
        int left = 2 * idx + 1;
        int right = 2 * idx + 2;
        int max_idx = idx;

        if (left zuojiankuohaophpcn n && heap[left] youjiankuohaophpcn heap[max_idx])
            max_idx = left;
        if (right zuojiankuohaophpcn n && heap[right] youjiankuohaophpcn heap[max_idx])
            max_idx = right;

        if (max_idx == idx) break;
        std::swap(heap[idx], heap[max_idx]);
        idx = max_idx;
    }
}

public: void push(int val) { heap.push_back(val); sift_up(heap.size() - 1); }

void pop() {
    if (heap.empty()) return;
    std::swap(heap[0], heap.back());
    heap.pop_back();
    sift_down(0);
}

int top() { return heap.empty() ? -1 : heap[0]; }
bool empty() { return heap.empty(); }

};

这个实现包含了基本的插入、删除和访问操作,使用数组模拟完全二叉树结构,通过 sift_up 和 sift_down 维护堆性质。

基本上就这些。C++ 的 priority_queue 封装得很好,大多数情况下直接使用标准库即可。了解其背后是堆结构,以及如何通过比较函数控制排序方向,就能灵活应对各种优先级调度场景。


# c++  # ios  # stream  # 标准库  # 数据类型  # 封装  # 结构体  # int  # void  #   # public  # operator  # 对象  # 算法  # 是一个  # 自定义  # 最小值  # 升序  # 很好  # 二叉树  # 就能  # 弹出  # 有两种  # 第三个 


相关文章: 建站主机选虚拟主机还是云服务器更好?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  深圳网站制作的公司有哪些,dido官方网站?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  简历在线制作网站免费版,如何创建个人简历?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何通过西部数码建站助手快速创建专业网站?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  广州建站公司哪家好?十大优质服务商推荐  建站之星各版本价格是多少?  盘锦网站制作公司,盘锦大洼有多少5G网站?  css网站制作参考文献有哪些,易聊怎么注册?  建站三合一如何选?哪家性价比更高?  建站之星多图banner生成与模板自定义指南  已有域名和空间如何搭建网站?  建站主机选择指南:服务器配置与SEO优化实战技巧  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何实现建站之星域名转发设置?  如何高效完成自助建站业务培训?  如何快速搭建二级域名独立网站?  北京网站制作网页,网站升级改版需要多久?  C++如何编写函数模板?(泛型编程入门)  如何在IIS中新建站点并配置端口与物理路径?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  教程网站设计制作软件,怎么创建自己的一个网站?  如何通过FTP服务器快速搭建网站?  建站为何优先选择香港服务器?  常州自助建站工具推荐:低成本搭建与模板选择技巧  广德云建站网站建设方案与建站流程优化指南  成都网站制作报价公司,成都工业用气开户费用?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  家具网站制作软件,家具厂怎么跑业务?  魔方云NAT建站如何实现端口转发?  高防服务器租用首荐平台,企业级优惠套餐快速部署  建站之星如何开启自定义404页面避免用户流失?  再谈Python中的字符串与字符编码(推荐)  如何快速建站并高效导出源代码?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  如何快速启动建站代理加盟业务?  如何在Windows环境下新建FTP站点并设置权限?  简单实现Android文件上传  内网网站制作软件,内网的网站如何发布到外网?  外贸公司网站制作哪家好,maersk船公司官网?  PHP正则匹配日期和时间(时间戳转换)的实例代码  淘宝制作网站有哪些,淘宝网官网主页?  建站10G流量真的够用吗?如何应对访问高峰?  建站之星后台管理:高效配置与模板优化提升用户体验  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  制作网站怎么制作,*游戏网站怎么搭建?  如何在橙子建站中快速调整背景颜色? 

您的项目需求

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