C++中的优先级队列

时间:2020-02-23 14:30:02  来源:igfitidea点击:

优先级队列是队列的一种变体,可以根据其优先级对元素进行排序。
C++在其标准模板库(STL)中具有内置的优先级队列数据结构。

优先级队列在C++中作为容器适配器实现。

这意味着像其他容器适配器一样,它们具有容器对象的成员功能。

让我们了解如何使用C++中的Priority Queue容器创建自己的优先级队列。

创建优先级队列

我们可以通过声明类型为std :: priority_queue <type>的优先级队列变量来创建优先级队列。

std ::名称空间表示它支持STL(标准模板库)操作。

注意:要使用此功能,我们必须在程序中包含 <queue>头文件。

由于这是STL的容器,因此我们必须提供队列的模板类型。
它可以是intfloatcharstring等中的任何一种。

例如,以下是优先级队列的有效声明。

#include <queue>
#include <string>

std::priority_queue<int> pq1;
std::priority_queue<float> pq2;
std::priority_queue<std::string> pq3;

优先级队列上的常用方法

优先级队列容器支持的一些方法是:

让我们以示例的方式了解上述方法。
下面的代码使用上述所有涉及优先级队列的方法。

其中我们创建一个整数优先级队列,并依次插入元素100、200、400和50。

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

using namespace std;

void print_pqueue (priority_queue<int> pq) {
  //Prints the Priority Queue
  priority_queue<int> copy_q = pq;
  cout << "Priority Queue : ";
  while (!copy_q.empty()) {
      cout << copy_q.top() << " ";
      copy_q.pop();
  }
  cout << "\n";
}

int main() {
  //Program demonstrating use of Priority Queue
  //methods
  
  //Create an empty priority queue of integers
  priority_queue<int> queue_int;

  //Is the Queue empty now? Yes!
  cout << "Is the Queue empty now? : " << (queue_int.empty() ? "Yes" : "No") << endl;

  //Let's add some elements!
  cout << "Adding some elements...\n";
  queue_int.push(100);
  queue_int.push(200);
  queue_int.push(400);
  queue_int.push(50);

  cout << "Number of elements : " << queue_int.size() << endl;
  cout << "Top element : " << queue_int.top() << endl << endl;

  print_pqueue(queue_int);

  cout << "Popping element from the top...\n\n";
  queue_int.pop();
  print_pqueue(queue_int);
  
  return 0;
}

请注意,由于优先级队列中的元素从顶部开始按降序排列,因此插入将如下所示:

优先队列

推送到队列后,我们从队列中弹出最上面的元素,即优先级最高的元素。

因此,将弹出400,使200作为队列的新头。

这显示了我们如何轻松使用优先级队列容器。
让我们继续讨论您想要拥有自己的优先级方案的情况。

Is the Queue empty now? : Yes
Adding some elements...
Number of elements : 4
Top element : 400

Priority Queue : 400 200 100 50 
Popping element from the top...

Priority Queue : 200 100 50

默认情况下,C++优先级队列仅根据排序后的值评估优先级。
我们可以通过实现自己的比较功能来改变它!

实现我们自己的比较功能

我们可以通过重载STL比较运算符来重载默认比较功能。

为此,我们必须首先创建一个比较类。
让我们称之为" CompareClass",然后在" operator()"块中引入我们的自定义比较。

由于这是一个比较函数,因此必须返回一个布尔值,并且也必须是公共值。

代码结构看起来与此类似。
现在,我们根据值的升序进行比较!

我们还没有完成。
我们需要使编译器意识到我们将这个新类用于比较运算符。

//Create a Comparison Class for our
//integer priority queue
class CompareClass {
  public:
      bool operator() (int a, int b) {
          if (a > b)
              return true;
          return false;
      }
};

为此,我们将需要在我们的priority_queue &lt;>STL调用中添加两个参数。

第二个参数告诉编译器该队列被实现为vector &lt;type>
第三个是我们的比较班。

priority_queue<type, vector<type>, CompareClass()> pqueue;

我们将修改旧代码以包括这些新更改。

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

using namespace std;

//Create a Comparison Class for our
//integer priority queue
class CompareClass {
  public:
      bool operator() (int a, int b) {
          if (a > b)
              return true;
          return false;
      }
};

void print_pqueue (priority_queue<int, vector<int>, CompareClass> pq) {
  //Prints the Priority Queue
  priority_queue<int, vector<int>, CompareClass> copy_q = pq;
  cout << "Priority Queue : ";
  while (!copy_q.empty()) {
      cout << copy_q.top() << " ";
      copy_q.pop();
  }
  cout << "\n";
}

int main() {
  //Program demonstrating use of Priority Queue
  //methods
  
  //Create an empty priority queue of integers
  priority_queue<int, vector<int>, CompareClass> queue_int;

  //Is the Queue empty now? Yes!
  cout << "Is the Queue empty now? : " << (queue_int.empty() ? "Yes" : "No") << endl;

  //Let's add some elements!
  cout << "Adding some elements...\n";
  queue_int.push(100);
  queue_int.push(200);
  queue_int.push(400);
  queue_int.push(50);

  cout << "Number of elements : " << queue_int.size() << endl;
  cout << "Top element : " << queue_int.top() << endl << endl;

  print_pqueue(queue_int);

  cout << "Popping element from the top...\n\n";
  queue_int.pop();
  print_pqueue(queue_int);
  
  return 0;
}

输出

Is the Queue empty now? : Yes
Adding some elements...
Number of elements : 4
Top element : 50

Priority Queue : 50 100 200 400 
Popping element from the top...

Priority Queue : 100 200 400 

观察到我们现在根据其值的升序插入元素,因此队列的顶部是最低的元素。