📜  C++中的优先级队列(1)

📅  最后修改于: 2023-12-03 15:29:54.228000             🧑  作者: Mango

C++中的优先级队列

在C++中,优先级队列(priority queue)是一种可动态增删元素,依据特定优先级弹出元素的容器。优先级队列模板类位于头文件 <queue> 中,通常基于堆(heap)数据结构实现。

堆(heap)数据结构

堆是一种基于完全二叉树的数据结构,每个节点都与其子节点的大小关系是固定的,通常分为两种类型:

  • 最大堆(max heap):堆中每个节点的值都大于等于其子节点的值。
  • 最小堆(min heap):堆中每个节点的值都小于等于其子节点的值。

对于优先级队列而言,通常使用最大堆实现,因为堆顶元素是最大元素,便于处理优先级。

优先级队列模板类的定义

优先级队列模板类可以定义为下方的样式:

template<class T, class Container = vector<T>,
         class Compare = less<typename Container::value_type>>
class priority_queue;

其中:

  • T:队列中的数据类型;
  • Container:存储队列数据的容器类型,支持 vector、list、deque等;
  • Compare:比较函数,用于确定不同元素之间的优先级关系,默认为 std::less,即按照从大到小顺序存储元素。
优先级队列的操作

优先级队列支持以下操作:

  • push():将一个元素插入优先级队列尾部,自动调整其在堆中的位置;
  • pop():将堆顶元素弹出队列,自动调整其它元素在堆中的位置;
  • top():返回堆顶元素,不同于队列,仅仅是读取而非删除;
  • size():返回队列元素个数;
  • empty():判断队列是否为空。

下面是一个简单的使用优先级队列实现堆排序的例子:

#include <iostream>
#include <queue>
using namespace std;

void heap_sort(vector<int>& v) {
    priority_queue<int, vector<int>, less<int>> pq;
    for (auto x : v) {
        pq.push(x);
    }
    for (int i = v.size() - 1; i >= 0; --i) {
        v[i] = pq.top();
        pq.pop();
    }
}

int main() {
    vector<int> v = {4, 1, 3, 2, 7, 6};
    heap_sort(v);
    for (auto x : v) {
        cout << x << ' ';
    }
    cout << '\n';
    return 0;
}

在上方代码中,使用优先级队列将vector容器中元素排序,依据降序依次读取最大值并放在vector容器内。优先级队列的默认排序方法是less,即从大到小排列。