📅  最后修改于: 2023-12-03 15:14:03.337000             🧑  作者: Mango
优先级队列(Priority Queue)是一种特殊的队列,可以让我们在插入元素时,将元素插入到合适的位置,而不是简单的追加在队列的尾部。在优先级队列中,元素的出队顺序不是先进先出(FIFO),而是按照优先级进行排序。
在C++ STL中,我们可以使用<queue>
头文件中的priority_queue
容器来实现优先级队列。priority_queue
容器默认情况下是将元素按照从大到小的顺序进行排序,也就是说,每次出队的元素都是当前队列中最大的元素。但是我们也可以通过指定元素的比较函数来改变排序方式。
如果我们希望按照元素的第一个和第二个值进行排序,可以使用一个自定义的结构体,并在结构体中定义一个比较函数,具体实现如下:
#include <iostream>
#include <queue>
using namespace std;
struct Element {
int x;
int y;
bool operator < (const Element& elem) const {
if (x != elem.x) {
return x < elem.x;
} else {
return y < elem.y;
}
}
};
int main() {
priority_queue<Element> q;
q.push({1, 2});
q.push({1, 1});
q.push({1, 3});
while (!q.empty()) {
auto elem = q.top();
q.pop();
cout << elem.x << " " << elem.y << endl;
}
return 0;
}
在上面的代码中,我们定义了一个Element
结构体,其中包含两个整型成员变量x
和y
。我们重载了<
运算符,并定义了自己的比较函数。在比较函数中,如果两个元素的x
值不相等,则按照x
值进行排序;如果x
值相等,则按照y
值进行排序。
我们创建了一个priority_queue<Element>
类型的优先级队列,并在队列中插入了三个Element
元素。由于我们定义了自己的比较函数,所以这些元素将会按照我们定义的规则进行排序。最后,我们从队列中取出元素,并输出它们的x
和y
值,结果为:
1 1
1 2
1 3
可以看到,按照我们自己的规则,元素已经按照x
和y
值进行了排序。
本文介绍了C++中的优先级对队列并演示了如何按照元素的第一个和第二个值进行排序。通过重载比较运算符,可以实现自定义排序规则。