📌  相关文章
📜  C ++中对优先级队列,按第一个和第二个元素排序(1)

📅  最后修改于: 2023-12-03 15:29:42.860000             🧑  作者: Mango

C++中对优先级队列,按第一个和第二个元素排序

介绍优先级队列

优先级队列是一种特殊的队列,它的元素按照优先级排序。当我们向优先级队列中添加元素时,它会根据元素的优先级自动进行排序,最高优先级的元素始终位于队列的开头。当我们从优先级队列中取出元素时,它会返回队列中最高优先级的元素。

在C++中,优先级队列是通过头文件<queue>中的priority_queue类实现的。

优先级队列的默认排序

在C++中,如果我们使用默认的优先级队列,它会将元素按照从大到小的顺序进行排序。也就是说,较小的元素具有较高的优先级,它们将位于队列的开始位置。

下面是一个简单的例子,用于说明默认排序方式:

#include <iostream>
#include <queue>
using namespace std;

int main () {
  priority_queue<int> pq;

  pq.push(10);
  pq.push(30);
  pq.push(20);

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

  return 0;
}

输出结果为:

30 20 10

从结果可以看出,优先级队列默认按照从大到小的顺序进行排序,最高优先级的元素为30,其次是20,最低优先级的元素是10。

自定义排序

如果我们想要按照自己的方式对优先级队列中的元素进行排序,可以通过传递一个比较函数来实现。比较函数必须返回一个布尔值,如果第一个参数比第二个参数小,则返回true,否则返回false。

下面是一个例子,它按照元素的第一个和第二个属性对元素进行排序:

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

struct Element {
  int x, y;
};

struct Compare {
  bool operator()(const Element& a, const Element& b) const {
    if (a.x == b.x) {
      return a.y > b.y;
    }
    return a.x > b.x;
  }
};

int main () {
  priority_queue<Element, vector<Element>, Compare> pq;

  pq.push({3, 4});
  pq.push({1, 2});
  pq.push({1, 3});
  pq.push({2, 1});

  while (!pq.empty()) {
    auto [x, y] = pq.top();
    cout << "(" << x << ", " << y << ") ";
    pq.pop();
  }

  return 0;
}

输出结果为:

(1, 2) (1, 3) (2, 1) (3, 4) 

从结果可以看出,优先级队列按照元素的第一个属性进行排序,如果第一个属性相同,则按照第二个属性进行排序。在这个例子中,(1,2)的第一个属性最小,因此它具有最高的优先级,而(3,4)的第一个属性最大,因此它具有最低的优先级。如果第一个属性相同,则元素的第二个属性决定它们的先后顺序。

结论

优先级队列是一种非常有用的数据结构,它可以帮助我们轻松地对元素进行排序。在C++中,我们可以使用默认的排序方式,也可以通过自定义比较函数来实现特定的排序方式。无论你是在写算法竞赛的代码,还是在处理实际的编程问题,优先级队列都是一种非常有用的工具。