📜  初始化优先队列的有效方法(1)

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

初始化优先队列的有效方法

优先队列(Priority Queue)是一个有序队列,每个元素都有一个优先级,优先级最高的元素最先被取出。本文将为程序员介绍初始化优先队列的有效方法。

方法一:构造函数

在C++中,STL库提供了优先队列容器——std::priority_queue。使用该容器时,我们可以通过构造函数来初始化一个为空的优先队列。

#include <queue>

std::priority_queue<int> pq;

上述代码将创建一个名称为pq的整型优先队列。

默认情况下,std::priority_queue以降序排序,即优先级最高的元素会排在最前面。如果需要升序排序,则可以如下初始化:

#include <queue>

std::priority_queue<int, std::vector<int>, std::greater<int>> pq2;

上述代码创建一个名称为pq2的整型优先队列,且以升序排序。

方法二:lambda表达式

除了使用构造函数初始化一个空的优先队列,我们还可以通过lambda表达式来指定排序规则。

#include <queue>

auto cmp = [](int a, int b) { return a > b; };
std::priority_queue<int, std::vector<int>, decltype(cmp)> pq(cmp);

上述代码创建了一个名称为pq的整型优先队列,并指定了降序排序规则。其中,decltype(cmp)表示指定比较函数的类型为cmp的类型。

如果我们需要升序排序,则可以将lambda表达式修改为:

auto cmp = [](int a, int b) { return a < b; };
std::priority_queue<int, std::vector<int>, decltype(cmp)> pq2(cmp);

上述代码创建了一个名称为pq2的整型优先队列,并指定了升序排序规则。

方法三:自定义结构体

如果需要自定义数据类型的优先队列,可以使用自定义结构体来指定排序规则。

#include <queue>
#include <string>

struct Person {
    std::string name;
    int age;
    bool operator<(const Person &p) const {
        // 根据年龄来比较大小
        return age < p.age;
    }
};

std::priority_queue<Person> pq;

// 添加元素
pq.push({"Amy", 20});
pq.push({"Bob", 18});
pq.push({"Cathy", 22});

上述代码创建了一个名称为pq的自定义数据类型优先队列。由于Person结构体实现了小于运算符重载函数,因此将会以年龄为优先级进行排序。

总结一下,初始化优先队列的有效方法有:

  • 通过构造函数创建一个空的优先队列;
  • 使用lambda表达式指定比较函数后创建优先队列;
  • 使用自定义结构体来指定排序规则创建优先队列。

以上就是初始化优先队列的有效方法。希望对程序员们有所帮助。