std::priority_queue 数据结构

std::priority_queue 是 C++ 标准库中的一个容器适配器,用于实现优先队列(priority queue)。优先队列是一种数据结构,其中的元素按照优先级排序,具有最高优先级的元素会被最先访问。std::priority_queue 默认使用最大堆(max-heap)作为底层容器,确保最大元素位于队列的顶部。

1. 类介绍

std::priority_queue 的主要特点包括:

  • 优先级排序:元素按照优先级排序,默认情况下,具有最大值的元素优先级最高。
  • 底层容器:通常使用 std::vector 作为底层容器,但可以指定其他底层容器。
  • 提供高效的访问:允许在对数时间内插入和删除元素。

2. 基本操作

创建和初始化:

#include <iostream>
#include <queue>
#include <vector>

int main() {
    // 默认底层容器是 std::vector
    std::priority_queue<int> pq;

    // 使用自定义比较函数
    auto cmp = [](int left, int right) { return left > right; }; // 最小堆
    std::priority_queue<int, std::vector<int>, decltype(cmp)> pq_custom(cmp);

    return 0;
}

优先队列操作:

#include <iostream>
#include <queue>

int main() {
    std::priority_queue<int> pq;

    // 插入元素
    pq.push(10);
    pq.push(20);
    pq.push(30);

    // 输出优先队列的最大元素
    std::cout << "Top element: " << pq.top() << std::endl;

    // 删除最大元素
    pq.pop();

    // 输出新的最大元素
    std::cout << "Top element after pop: " << pq.top() << std::endl;

    // 检查优先队列是否为空
    std::cout << "Is priority queue empty? " << (pq.empty() ? "Yes" : "No") << std::endl;

    // 获取优先队列的大小
    std::cout << "Priority queue size: " << pq.size() << std::endl;

    return 0;
}

3. 成员函数

push(const value_type& value)
将元素添加到优先队列中,保持优先队列的优先级顺序。

pop()
移除优先队列中优先级最高的元素。

top()
返回优先队列中优先级最高的元素,但不移除它。

empty()
检查优先队列是否为空。返回 true 如果队列为空,false 如果队列不为空。

size()
返回优先队列中元素的数量。

4. 自定义比较函数

std::priority_queue 默认使用最大堆(max-heap),即最大元素在顶部。如果需要自定义优先级(如最小堆),可以提供一个比较函数:

#include <iostream>
#include <queue>
#include <vector>

int main() {
    // 自定义比较函数(最小堆)
    auto cmp = [](int left, int right) { return left > right; };
    std::priority_queue<int, std::vector<int>, decltype(cmp)> pq_custom(cmp);

    // 插入元素
    pq_custom.push(10);
    pq_custom.push(20);
    pq_custom.push(30);

    // 输出优先队列的最小元素
    std::cout << "Top element (min-heap): " << pq_custom.top() << std::endl;

    return 0;
}

5. 底层容器

std::priority_queue 默认使用 std::vector 作为底层容器,底层容器负责存储元素并提供支持堆操作的接口。可以使用其他容器,如 std::deque,但通常 std::vector 是最常用的选择,因为它提供了较好的内存布局和访问性能。

6. 总结

std::priority_queue 是一个提供优先级排序的容器适配器,确保具有最高优先级的元素在顶部。它支持基本的优先级队列操作,如插入、删除和访问顶部元素。通过自定义比较函数,可以实现不同的优先级策略,如最小堆。std::priority_queue 默认使用 std::vector 作为底层容器,但可以根据需要选择其他容器。