📜  C++ STL 中向量的优先级队列示例(1)

📅  最后修改于: 2023-12-03 14:39:50.422000             🧑  作者: Mango

C++ STL中向量的优先级队列示例

优先级队列是STL中的一个高效数据结构,其内部使用堆实现,可以用于解决很多实际问题,如Dijkstra最短路径算法、Huffman编码等等。在STL中,优先级队列的底层数据结构是堆,在STL中,优先级队列不支持遍历,仅支持插入元素,并以优先级顺序弹出元素,因此具有很高的效率。

优先级队列示例代码

以下是一个简单的示例代码,演示如何使用STL中的优先级队列读入一些数字并以单调递减的顺序输出这些数字。

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

int main() {
    int n, x;
    priority_queue<int, vector<int>, greater<int>> q; // 小根堆

    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> x;
        q.push(x);
    }

    while (!q.empty()) {
        cout << q.top() << endl;
        q.pop();
    }

    return 0;
}

在这段代码中,我们首先定义了一个priority_queue对象,使用了第二、第三个模板参数来指定使用一个基于vector的堆,并使用greater<int>指定了小根堆。然后我们读入了一些数字并将它们插入到队列中,最后按序弹出每一个元素并打印出来。

代码解释
头文件
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

首先我们需要包含STL头文件<iostream><queue><vector>

堆定义
priority_queue<int, vector<int>, greater<int>> q;

这行代码定义了一个priority_queue对象,使用了第二、第三个模板参数来指定使用一个基于vector的堆,并使用greater<int>指定小根堆。也就是说,我们创建的堆是一个小根堆。

元素插入
for (int i = 0; i < n; i++) {
    cin >> x;
    q.push(x);
}

在这个循环中,我们读入了一些数字,并将它们插入到堆中。

元素弹出
while (!q.empty()) {
    cout << q.top() << endl;
    q.pop();
}

在这个循环中,我们使用top()取出当前的最小元素,接着使用pop()将其从堆中弹出。这个循环会一直重复,直到堆为空(即没有元素需要弹出了)。

总结

优先级队列是一个非常有用的数据结构,可以使用STL中的priority_queue来快速、方便地实现。本文介绍了如何使用STL中的priority_queue读入一些数字并以单调递减的顺序输出这些数字。这里非常建议读者自己亲手尝试一下,深入理解该数据结构的使用方法。