📜  C++标准模板库(STL)中的优先级队列(1)

📅  最后修改于: 2023-12-03 14:39:59.772000             🧑  作者: Mango

C++标准模板库(STL)中的优先级队列

简介

优先级队列是C++标准模板库(STL)中的一个容器适配器,用于实现具有优先级的数据结构。它允许在插入数据时自动按照一定的顺序进行排序,并在访问元素时返回具有最高优先级的元素。

优先级队列是基于堆实现的,可用于解决很多实际问题,如任务调度、数据压缩、贪心算法等。

使用方法

要使用优先级队列,需要包含C++标准库中的 <queue> 头文件。

#include <queue>

然后,可以声明一个优先级队列对象,并指定元素类型和排序方式。

std::priority_queue<int> pq; // 默认以降序排列
插入元素

要向优先级队列中插入元素,可以使用 push() 成员函数。

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

在上述例子中,插入元素10后,队列变为 {10};再插入元素5后,队列变为 {10, 5};最后插入元素20后,队列变为 {20, 10, 5}

访问元素

要访问优先级队列中具有最高优先级的元素,可以使用 top() 成员函数。

int highest = pq.top(); // 返回最高优先级元素,此时为20
删除元素

要删除优先级队列中具有最高优先级的元素,可以使用 pop() 成员函数。

pq.pop(); // 删除最高优先级元素,队列变为 `{10, 5}`
自定义排序

默认情况下,优先级队列以降序排列,也就是具有较大值的元素具有较高优先级。如果需要自定义排序方式,可以提供一个自定义的比较函数。

// 自定义比较函数
bool compare(int a, int b) {
    return a < b; // 以升序排列
}

std::priority_queue<int, std::vector<int>, compare> pq;
在容器中使用对象

优先级队列可以存储自定义类型的对象,只需确保元素类型具有可比较性。以下是一个示例:

#include <iostream>
#include <queue>
#include <string>

// 自定义对象
class Person {
public:
    std::string name;
    int age;

    Person(std::string n, int a) : name(n), age(a) {}
};

// 自定义比较函数
struct Compare {
    bool operator()(Person const& p1, Person const& p2) {
        return p1.age < p2.age;
    }
};

int main() {
    std::priority_queue<Person, std::vector<Person>, Compare> pq;

    pq.push(Person("Alice", 25));
    pq.push(Person("Bob", 20));
    pq.push(Person("Charlie", 30));

    // 访问具有最高优先级的Person对象
    Person highest = pq.top();
    std::cout << highest.name << " is " << highest.age << " years old." << std::endl;

    return 0;
}

在上述示例中,自定义了一个 Person 类,然后使用自定义的比较函数 Compare 对其进行排序。最后,通过访问 top() 方法获取队列中具有最高优先级的Person对象。

总结

优先级队列是C++标准模板库中强大的工具,它提供了自动排序和访问具有最高优先级元素的功能。无论您是处理实际问题还是在算法设计中使用优先级队列,了解其使用方法和特性都是非常重要的。

更多关于优先级队列的细节和使用情况,请查阅C++标准库文档。