C 之优先队列

红尘紫陌 2024-09-07 ⋅ 11 阅读

什么是优先队列?

优先队列(Priority Queue)是一种数据结构,它将元素按照优先级进行排序,并且每次取出的都是具有最高优先级的元素。在C++中,我们可以使用STL库中的priority_queue来实现优先队列。

优先队列的实现

在C++中,priority_queue是一个模板类,定义在<queue>头文件中。其使用方式如下:

#include <queue>

std::priority_queue<int> pq; // 创建一个int类型的优先队列

创建优先队列之后,我们可以使用以下几个重要的操作来操作优先队列:

  • push():将元素插入到优先队列中
  • pop():删除优先队列中的最高优先级的元素
  • top():获取优先队列中的最高优先级的元素
  • empty():判断优先队列是否为空
  • size():获取优先队列中的元素个数

优先队列的排序规则

在默认情况下,优先队列按照元素的大小进行排序,即最大的元素具有最高的优先级。例如,当优先队列中的元素是数组{1, 5, 3, 2, 4}时,最高优先级的元素是5。

但是在实际应用中,我们有时需要自定义元素的排序规则。我们可以通过指定第三个参数来实现自定义排序规则,该参数是一个比较函数。

关于比较函数的定义,我们可以有两种方式:

  1. 定义一个函数,并将其作为比较函数。
bool compare(int a, int b) {
  return a > b;
}

std::priority_queue<int, std::vector<int>, decltype(compare)*> pq(compare);
  1. 使用Lambda表达式定义比较函数。
std::priority_queue<int, std::vector<int>, decltype([](int a, int b) { return a > b; })> pq([](int a, int b) { return a > b; });

在以上两种方式中,我们都使用了自定义的比较函数来实现优先队列的自定义排序规则。

示例代码

下面是一个使用优先队列的示例代码,该代码使用了自定义的排序规则。

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

bool compare(int a, int b) {
  return a > b;
}

int main() {
  std::priority_queue<int, std::vector<int>, decltype(compare)*> pq(compare);

  pq.push(5);
  pq.push(2);
  pq.push(8);
  pq.push(4);

  while (!pq.empty()) {
    std::cout << pq.top() << " ";
    pq.pop();
  }

  return 0;
}

输出结果为:8 5 4 2

上述代码中,我们首先定义了一个自定义的比较函数compare,然后创建了一个按照降序排序的优先队列pq。接着将元素依次插入到优先队列中,并使用top()函数输出当前最高优先级的元素,并使用pop()函数删除当前最高优先级的元素。

总结

优先队列是一种非常有用的数据结构,可在很多应用场景中发挥重要作用。通过使用C++中的priority_queue,我们可以很方便地实现优先队列,并且还可以根据需要自定义排序规则。掌握优先队列的使用方法将有助于提高我们的程序开发效率,为解决实际问题提供更好的解决方案。


全部评论: 0

    我有话说: