C++中的优先级队列
优先级队列是队列的一种变体,可以根据其优先级对元素进行排序。
C++在其标准模板库(STL)中具有内置的优先级队列数据结构。
优先级队列在C++中作为容器适配器实现。
这意味着像其他容器适配器一样,它们具有容器对象的成员功能。
让我们了解如何使用C++中的Priority Queue容器创建自己的优先级队列。
创建优先级队列
我们可以通过声明类型为std :: priority_queue <type>的优先级队列变量来创建优先级队列。
std ::
名称空间表示它支持STL(标准模板库)操作。
注意:要使用此功能,我们必须在程序中包含 <queue>头文件。
由于这是STL的容器,因此我们必须提供队列的模板类型。
它可以是int
,float
,char
,string
等中的任何一种。
例如,以下是优先级队列的有效声明。
#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 <>
STL调用中添加两个参数。
第二个参数告诉编译器该队列被实现为vector <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
观察到我们现在根据其值的升序插入元素,因此队列的顶部是最低的元素。