STL - priority_queue(优先队列)用法总结

(我的STL相关的博客目录:https://blog.youkuaiyun.com/Kprogram/article/details/90408011

(priority_queue-c++官网:http://www.cplusplus.com/reference/queue/priority_queue/

(什么是队列以及普通队列的用法移步这里:https://blog.youkuaiyun.com/Kprogram/article/details/82054436)

优先队列是一种特殊的队列,普通队列是先进先出,而优先队列是取队列中最小或最大的元素先出。

本文涉及优先队列两种基本的用法:

    1.使用C++自带的数据(如int),

    2.使用自己构造的数据结构。

0 - 头文件:queue  命名空间:std

#include <queue>
using namespace std;

1 - 使用C++自带的数据结构构建一个优先队列:priority_queue<typename> name 

    typename指的是队列内数据类型,可以是 int, double等等等等,但由于需要分出谁大谁小,所以数据类型必须具有可比性。

    name 是你构建的队列的名字,符合变量命名法则就行。

    例:构建一个 int 类型的优先队列, 名字叫做 Q。

queue<int> Q;

2 - 使用自己构造的数据结构构建一个优先队列:priority_queue<typename> name 

    可以看出,声明队列的方法是于上面相同的。

    但这里需要注意的是数据结构的声明:声明的数据结构必须能使用 " < " 进行比较,所以这里需要重载运算符

    (重载相当于可以自己定义"<"运算符对你声明的class的意义)

    例:构建一个自己的数据结构 "node",并声明一个node的优先队列。这样的队列每次出队的是最小值。若想出队最大元素,将 return F > a.F 改成 return F < a.F 即可。

class node {
public:

    //这里可以声明自己的数据
    int F;

    // 这里重载小于符号,返回的值则是 < 符号的运算值
    bool operator < (const node & a) const {
        return F > a.F;
    }
};

priority_queue<node> Q;

 

3.使用priority_queue:常用成员函数 ( 假设你创建的priority_queue对象名字叫 Q )

    (粉红色的函数为常用函数!大部分情况下这些函数就够用了)

无参函数:

    empty()如果queue为空,返回True, 反之则返回 False。

    top()返回队列顶端元素(最大的或最小的那个元素)

    pop()删除队列第一个元素,并不返回元素(一般与front()配合使用:先返front(),再pop(),相当于出队列操作)。

    size()返回queue内数据的个数(相当于数组长度)。

#一般用法:(假如是一个int类型的队列)
while(!Q.empty()) {//当队列不为空
    int I = Q.top(); Q.pop();//元素出队列
    ...//对I的某些操作

有参函数:

    push(type)把一个数据(type)压入栈顶(相当于入栈)。

    swap(Q1):交换Q 和 Q1 中的内容(Q1是另一个swap对象)。

//假设队列内的数据类型是data
class data {
  int a;
  int b;
public:
  data(int x, int y):a(x), b(y) {}
  bool operator < (const node & a) const {
      return a + b > a.a + a.b;
  }
};

priority_queue<node> Q;
//push:
data d(1,2);
Q.push(d); 
//或者
Q.push(data(1,2)); 

    push的优化:emplace函数(点击蓝色字体>emplace<)

### 在 C++ 中使用优先队列 (`priority_queue`) 的方法 在 C++ 标准模板库(STL)中,`priority_queue` 是一种容器适配器,用于实现最大堆或最小堆结构。默认情况下,它是一个最大堆,即每次访问时返回的最大元素位于顶部。以下是关于如何在 C++ 编程中使用 `priority_queue` 的详细介绍。 #### 默认行为:最大堆 创建一个简单的整数类型的优先队列,默认会构建一个最大堆。 ```cpp #include <iostream> #include <queue> using namespace std; int main() { priority_queue<int> pq; // 创建一个最大堆 pq.push(10); pq.push(5); pq.push(20); while (!pq.empty()) { cout << pq.top() << " "; // 输出当前最大的元素 pq.pop(); // 移除栈顶元素 } return 0; } ``` 在此代码片段中,`push()` 方法向队列中添加新元素,而 `top()` 返回当前队列中的最大值[^1]。 #### 自定义排序规则:最小堆 为了使 `priority_queue` 成为最小堆,可以指定第三个模板参数为 `std::greater<T>`,其中 T 是存储的元素类型。 ```cpp #include <iostream> #include <queue> #include <vector> #include <functional> using namespace std; int main() { priority_queue<int, vector<int>, greater<int>> minPQ; // 定义最小堆 minPQ.push(10); minPQ.push(5); minPQ.push(20); while (!minPQ.empty()) { cout << minPQ.top() << " "; // 输出当前最小的元素 minPQ.pop(); } return 0; } ``` 这里我们通过传递 `std::greater<int>` 给 `priority_queue` 来反转其默认顺序,从而形成一个最小堆[^2]。 #### 存储更复杂的类型:如 pair 或 struct 除了基本数据类型外,还可以将更为复杂的数据结构存入到 `priority_queue` 中。例如,我们可以存储键值对 `(key, value)` 并根据第一个成员进行排序。 ```cpp #include <iostream> #include <queue> #include <vector> #include <utility> // for std::pair using namespace std; struct ComparePair { bool operator()(const pair<int, string>& p1, const pair<int, string>& p2) { return p1.first < p2.first; // 大根堆比较方式 } }; int main() { priority_queue<pair<int, string>, vector<pair<int, string>>, ComparePair> pqWithPairs; pqWithPairs.emplace(1, "Low"); pqWithPairs.emplace(3, "High"); pqWithPairs.emplace(2, "Medium"); while (!pqWithPairs.empty()) { auto topElement = pqWithPairs.top(); cout << "{" << topElement.first << ", \"" << topElement.second << "\"}" << endl; pqWithPairs.pop(); } return 0; } ``` 上面的例子展示了一个自定义比较函数类 `ComparePair`,允许我们将 `pair<int, string>` 类型的对象放入优先队列,并按照 `first` 字段降序排列[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值