📅  最后修改于: 2023-12-03 14:39:54.392000             🧑  作者: Mango
在 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++ 中的优先级队列容器,我们能够方便地对元素进行排序,实现了优先级队列的功能。通过自定义比较器,我们可以根据元素的属性灵活地定义排序规则。因此,在实际的开发工作中,应当灵活运用容器和算法,并根据具体的问题选择合适的数据结构和排序规则。