文章目录
- C++ 优先级队列用法与模拟实现
- 介绍
- 用法
- 头文件
- 1.创建优先级队列
- priority_queue
- 2. 插入元素
- push
- 3. 删除元素
- pop
- 访问顶部元素
- top
- 检查优先级队列的大小
- size
- 检查优先级队列是否为空
- empty
- 模拟实现
C++ 优先级队列用法与模拟实现
介绍
优先级队列(Priority Queue)是一种抽象数据类型,它类似于队列,但是每个元素都有一个优先级或权重。在优先级队列中,元素的出队顺序是按照优先级来进行的,而不是先进先出(FIFO)或后进先出(LIFO)。
在 C++ 中,优先级队列是通过 std::priority_queue
实现的,它是 C++ 标准库的一部分。std::priority_queue
是一个模板容器适配器,它提供常数时间复杂度的插入操作和 logarithmic 时间复杂度的删除操作。
用法
头文件
要使用 std::priority_queue
,你需要包含 <queue>
头文件。
#include <queue>
1.创建优先级队列
priority_queue
- (1)
构造函数,可以接受两个参数,一个比较函数和一个容器。是个显式构造,不用隐式类型转换。 - (2)
接受两个迭代器的构造函数,它允许你从一个范围[first, last)
中的元素初始化优先级队列
//(1)
priority_queue<int> pq1; // 创建一个整数类型的优先级队列
priority_queue<int, vector<int>, less<int>> pq2;//创建一个以vector作为底层容器类型的优先级队列,less是大堆
priority_queue<int, vector<int>, greater<int>> pq3; // 创建一个以vector作为底层容器类型的优先级队列,greater是小堆
//(2)
vector<int> vec = { 4, 1, 3, 2 };
priority_queue<int> pq(vec.begin(), vec.end());//pq 会用 vec 中的元素进行初始化,并按照最大堆的顺序排列
2. 插入元素
push
- 向优先级队列中插入元素。
pq.push(30);
pq.push(10);
pq.push(20);
3. 删除元素
pop
- 从优先级队列中删除具有最高优先级的元素。
pq.pop(); // 删除元素 30
访问顶部元素
top
- 访问优先级队列的顶部元素(具有最高优先级的元素)
int top = pq.top(); // 之前在pop中把30pop了,所以top现在是 20
检查优先级队列的大小
size
- 查看优先级队列中的元素数量。
size_t size = pq.size(); // size 现在是 2
检查优先级队列是否为空
empty
- 检查优先级队列是否为空。
bool isEmpty = pq.empty(); // isEmpty 现在是 false
模拟实现
下面是一个简单的优先级队列的模拟实现,使用数组和一个比较函数。
#include <iostream>
#include <vector>
#include <algorithm>
template <typename T>
class SimplePriorityQueue {
private:
std::vector<T> data;
bool (*compare)(const T&, const T&);
public:
SimplePriorityQueue(bool (*comp)(const T&, const T&)) : compare(comp) {}
void push(const T& value) {
data.push_back(value);
std::push_heap(data.begin(), data.end(), compare);
}
void pop() {
std::pop_heap(data.begin(), data.end(), compare);
data.pop_back();
}
T& top() {
return data.front();
}
bool empty() const {
return data.empty();
}
size_t size() const {
return data.size();
}
};
bool compareInt(const int& a, const int& b) {
return a > b; // 大根堆
}
int main() {
SimplePriorityQueue<int> pq(compareInt);
pq.push(30);
pq.push(10);
pq.push(20);
std::cout << "Top: " << pq.top() << std::endl; // 输出 30
pq.pop();
std::cout << "Top: " << pq.top() << std::endl; // 输出 20
return 0;
}
在这个模拟实现中,我们使用了 std::vector
来存储数据,并使用 std::push_heap
和 std::pop_heap
来维护堆的属性。我们还需要提供一个比较函数来定义元素的优先级。