📜  C++ 中列表的优先级队列及示例(1)

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

C++ 中列表的优先级队列及示例

在 C++ 中,std::priority_queue 是一个标准库提供的优先级队列容器,它可以将元素按照指定的优先级进行排序。优先级队列通常使用堆来实现,可以在 $O(\log n)$ 的时间复杂度内完成插入元素、删除元素、查询队首元素等操作。

使用优先级队列

要使用优先级队列,首先需要包含头文件 <queue>,并定义队列的类型和元素类型。例如,以下代码定义了一个整型的优先级队列:

#include <queue>
#include <iostream>

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

    // 向队列中插入元素
    q.push(1);
    q.push(2);
    q.push(3);

    // 遍历队列并输出元素
    while (!q.empty()) {
        std::cout << q.top() << std::endl;
        q.pop();
    }
    return 0;
}

这段代码演示了如何创建一个整数类型的优先级队列,并将元素 1、2、3 插入队列中。然后,通过循环遍历队列并使用 top()pop() 函数获取队首元素并删除它。注意,这里使用 top() 函数并不会将队首元素弹出队列,需要使用 pop() 函数来实现。

定义元素的优先级

在默认情况下,优先级队列使用元素类型默认的比较器来进行排序。例如,对于整数类型的元素,队列将按照从大到小的顺序对元素进行排序,因为 int 类型的比较器默认是从大到小排序的。因此,从以上代码的输出结果中,可以看到元素 3、2、1 按照从大到小的顺序进行了输出。

如果要按照元素的某个属性进行排序,可以自定义比较器。比较器需要是一个可以调用的函数对象,它接受两个参数,返回一个布尔值,表示第一个参数是否小于等于第二个参数。比较器可以使用函数指针、函数对象、Lambda 表达式等方式来创建。

例如,以下代码定义了一个字符类型的优先级队列,并使用 Lambda 表达式自定义了字符的排序规则:

#include <queue>
#include <iostream>

int main() {
    std::priority_queue<char, std::vector<char>, decltype([](char a, char b) { return a <= b; })> q;

    // 向队列中插入元素
    q.push('a');
    q.push('d');
    q.push('c');

    // 遍历队列并输出元素
    while (!q.empty()) {
        std::cout << q.top() << std::endl;
        q.pop();
    }
    return 0;
}

这段代码定义了一个字符类型的优先级队列,并使用 Lambda 表达式定义了一个比较器,使字符按照字典序从小到大排序。可以看到,输出结果为 a、c、d,符合预期。

总结

通过使用 C++ 中的优先级队列容器,我们能够方便地对元素进行排序,实现了优先级队列的功能。通过自定义比较器,我们可以根据元素的属性灵活地定义排序规则。因此,在实际的开发工作中,应当灵活运用容器和算法,并根据具体的问题选择合适的数据结构和排序规则。