std::priority_queue 是 C++ 标准库中的一个容器适配器,用于实现优先队列(堆)。它默认是一个最大堆(即优先级最高的元素在顶部),但可以通过自定义比较器实现最小堆或其他优先级规则。以下是 std::priority_queue 的基本用法:

1. 包含头文件

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

#include <queue>

2. 定义和初始化

可以定义一个 std::priority_queue,并指定元素类型和底层容器类型(默认为 std::vector):

std::priority_queue<int> maxHeap; // 默认最大堆

如果需要最小堆,可以传入自定义比较器:

std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;
  • int:元素类型。
  • std::vector<int>:底层容器类型(默认)。
  • std::greater<int>:比较器,用于实现最小堆。

优先队列的比较函数逻辑与 sort 相反,如果传入的是 less,得到的是最大堆,传入的是 greater,得到的是最小堆。而在 sort 中,传入 less,得到的是递增序列,传入 greater,得到的是递减序列。

3. 插入元素

使用 push 方法插入元素:

maxHeap.push(10);
maxHeap.push(5);
maxHeap.push(20);

4. 访问顶部元素

使用 top 方法访问优先级最高的元素(堆顶元素):

std::cout << "Top element: " << maxHeap.top() << std::endl;

5. 删除顶部元素

使用 pop 方法删除优先级最高的元素:

maxHeap.pop(); // 删除堆顶元素

6. 检查队列是否为空

使用 empty 方法检查队列是否为空:

if (maxHeap.empty()) {
    std::cout << "Priority queue is empty" << std::endl;
}

7. 获取队列大小

使用 size 方法获取队列中元素的数量:

std::cout << "Size: " << maxHeap.size() << std::endl;

8. 自定义比较器

可以通过自定义比较器实现复杂的优先级规则。例如,实现一个最小堆存储 tuple 类型:

auto cmp = [](const tuple<int, int, int> &a,
              const tuple<int, int, int> &b) -> bool {
    return get<0>(a) > get<0>(b);
};

priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>,
                decltype(cmp)>
    pq(cmp);
pq.push({1, 2, 3});
pq.push({2, 3, 4});
pq.push({3, 5, 6});
auto [t0, t1, t2] = pq.top();

在 C++ 17 版本中,在初始化 pq 时需要传入 cmp 比较函数,在 C++ 20 中则可以省略这个构造函数参数。tuple 的结构化绑定功能是在 C++ 17 中引入的。