C++ priority_queue 最大堆、最小堆的实现

本文介绍了C++标准库中的priority_queue容器适配器,重点讲解了其用于存储和管理元素的机制,以及如何通过不同的比较对象实现最大堆和最小堆。作者还提供了使用示例来展示基本操作。
摘要由CSDN通过智能技术生成

在C++标准库中,priority_queue 是一个容器适配器,它提供了队列的所有基本操作,包括元素的入队(push)和出队(pop),但是出队操作(top 和 pop)总是返回(并移除)优先级最高的元素。默认情况下,priority_queue 使用 std::vector 作为底层容器,并使用 std::less 作为比较对象,因此它实现了一个最大堆。

priority_queue 的典型声明如下:

std::priority_queue<T, Container, Compare> pq;
  • T 是队列中元素的类型。
  • Container 是用来存储元素的底层容器类型,默认为 std::vector<T>
  • Compare 是一个二元谓词,用于比较队列中的元素,以确定它们的优先级。默认为 std::less<T>,这意味着较大的元素具有更高的优先级。

对于最大堆,你不需要显式指定 Container 和 Compare,因为默认设置就是你想要的。但是,如果你想实现一个最小堆(即优先级最低的元素先出队),你需要提供一个不同的比较对象,如 std::greater<T>

以下是一些 priority_queue 的基本操作:

  • push(const value_type& val): 将元素添加到队列中。
  • top(): 返回队列中优先级最高的元素(但不移除它)。
  • pop(): 移除队列中优先级最高的元素。
  • empty() const: 如果队列为空,则返回 true
  • size() const: 返回队列中元素的数量。

下面是一个简单的 priority_queue 使用示例,展示了如何创建最大堆,并向其中添加元素、获取顶部元素和删除元素:

#include <iostream>  
#include <queue> // 包含priority_queue的定义  
  
int main() {  
    std::priority_queue<int> pq; // 创建一个int类型的最大堆  
  
    // 向优先队列中添加元素  
    pq.push(3);  
    pq.push(1);  
    pq.push(4);  
  
    // 输出并删除最高优先级的元素  
    while (!pq.empty()) {  
        std::cout << pq.top() << ' '; // 输出当前最高优先级的元素  
        pq.pop(); // 删除最高优先级的元素  
    }  
  
    return 0;  
}


输出将是:

4 3 1

因为这是一个最大堆,所以数字 4(具有最高优先级)首先被输出和删除,然后是 3,最后是 1

如果你想要实现一个最小堆,你可以这样声明 priority_queue

std::priority_queue<int, std::vector<int>, std::greater<int>> pq;

现在,pq 将会按照升序排列元素,因此 top() 操作将返回最小的元素,而 pop() 操作将移除最小的元素。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值