当前位置:首页 > C++ > 正文

C++ priority_queue详解(零基础入门STL优先队列)

在C++标准模板库(STL)中,priority_queue 是一个非常实用的容器适配器,它实现了优先队列(Priority Queue)这一抽象数据类型。本文将带你从零开始,深入浅出地掌握 C++ priority_queue 的基本概念、常用操作和实际应用场景。

什么是优先队列?

优先队列是一种特殊的队列,其中每个元素都有一个“优先级”。与普通队列(先进先出)不同,优先队列总是先弹出优先级最高的元素。在C++中,priority_queue 默认实现为一个最大堆(max-heap),即队首元素是最大的。

C++ priority_queue详解(零基础入门STL优先队列) priority_queue  C++优先队列教程 STL priority_queue用法 C++堆数据结构 第1张

如何包含头文件?

使用 priority_queue 需要包含 <queue> 头文件:

#include <iostream>#include <queue>  // 包含 priority_queue 所需头文件using namespace std;

基本声明与初始化

默认情况下,priority_queue 是一个最大堆:

// 声明一个存储 int 类型的最大堆priority_queue<int> pq;

你也可以显式指定底层容器和比较函数:

// 使用 vector 作为底层容器,less<int> 表示最大堆priority_queue<int, vector<int>, less<int>> max_pq;// 使用 greater<int> 实现最小堆priority_queue<int, vector<int>, greater<int>> min_pq;

常用成员函数

  • push(x):插入元素 x
  • pop():移除堆顶元素(不返回值)
  • top():返回堆顶元素(不移除)
  • empty():判断是否为空
  • size():返回元素个数

完整示例代码

下面是一个完整的 C++ priority_queue 示例,演示了最大堆和最小堆的使用:

#include <iostream>#include <queue>#include <vector>using namespace std;int main() {    // 最大堆(默认)    priority_queue<int> maxHeap;    maxHeap.push(10);    maxHeap.push(30);    maxHeap.push(20);    cout << "最大堆顶部元素: " << maxHeap.top() << endl; // 输出 30    maxHeap.pop();    cout << "弹出后顶部元素: " << maxHeap.top() << endl; // 输出 20    // 最小堆    priority_queue<int, vector<int>, greater<int>> minHeap;    minHeap.push(10);    minHeap.push(30);    minHeap.push(20);    cout << "最小堆顶部元素: " << minHeap.top() << endl; // 输出 10    return 0;}

自定义类型的优先队列

当处理自定义结构体或类时,你需要提供比较规则。例如,按学生分数从高到低排序:

struct Student {    string name;    int score;};// 自定义比较函数(仿函数)struct CompareStudent {    bool operator()(const Student& a, const Student& b) {        return a.score < b.score; // 最大堆:分数高的优先    }};// 使用方式priority_queue<Student, vector<Student>, CompareStudent> pq;

常见应用场景

C++ priority_queue 在算法和工程中用途广泛,例如:

  • 任务调度(优先级高的任务先执行)
  • Dijkstra 最短路径算法
  • 合并 K 个有序链表
  • Top-K 问题(如找出成绩最高的前10名学生)

总结

通过本教程,你应该已经掌握了 C++ priority_queue 的基本用法。记住:

  • 默认是最大堆,使用 greater<T> 可变为最小堆
  • 不能直接遍历 priority_queue,只能通过 top()pop() 访问
  • 对于自定义类型,需提供比较逻辑

希望这篇 C++优先队列教程 能帮助你轻松上手 STL 中的 priority_queue!无论是面试还是实际开发,掌握 STL priority_queue用法 都将大大提升你的编程效率。

关键词回顾:C++ priority_queueC++优先队列教程STL priority_queue用法C++堆数据结构