C++小根堆做优先队列
时间: 2024-10-27 19:08:49 浏览: 21
在C++中,小根堆(也称为最小堆)是一种常用的数据结构,用于实现优先队列。优先队列的特点是可以快速获取当前“优先级最高”的元素,常用于需要处理优先级任务的情况,如任务调度、事件驱动系统等。
小根堆是一个完全二叉树,满足每个节点都小于或等于其子节点的值(对于最小堆)。插入新元素时,将其添加到堆顶,然后调整堆结构以保持性质;删除堆顶元素(即当前优先级最高的元素)后,将堆底的元素替换到堆顶,并再次调整堆。
以下是使用C++ STL库中的`priority_queue`实现优先队列的基本步骤:
```cpp
#include <queue>
using namespace std;
// 创建一个最小堆作为优先队列
priority_queue<int, vector<int>, greater<int>> pq; // 使用greater模板函数指定升序排序
// 插入元素
pq.push(5); // 元素5的优先级较高
pq.push(3);
pq.push(7);
// 获取并移除优先级最高的元素
int topPriority = pq.top(); // 返回当前最大值(最小优先级)
pq.pop(); // 删除当前元素
相关问题
c++ 优先队列 小根堆
在C++中,优先队列默认是大根堆,也就是说,队列中的元素按照从大到小的顺序排列。如果想要使用小根堆,需要在定义优先队列时指定底层容器类型为vector,比较函数为greater。下面是一个小根堆的例子:
```
#include <iostream>
#include <queue>
using namespace std;
int main() {
priority_queue<int, vector<int>, greater<int>> q;
q.push(3);
q.push(5);
q.push(1);
while(!q.empty()) {
cout << q.top() << endl;
q.pop();
}
return 0;
}
```
在这个例子中,我们使用了STL自带的小根堆,因此需要将vector改为greater<int>。其中,vector<int>是指底层容器的类型,而greater<int>是指比较函数对象的类型。
另外,如果想要使用自定义类型的小根堆,需要在定义结构体时重载小于号运算符,如下所示:
```
struct cs {
int x;
bool operator < (const cs &rhs) const {
return x > rhs.x;
}
} a;
priority_queue<cs> Q;
```
这样就可以使用自定义类型的小根堆了。
c++优先队列小根堆
C++中的优先队列默认是大根堆,如果要使用小根堆,可以通过以下两种方式实现:
1. 自定义比较函数
在创建优先队列时,可以自定义比较函数,使其按照小根堆的方式进行排序。比较函数需要返回一个bool类型的值,表示两个元素的大小关系。
```cpp
#include <queue>
using namespace std;
struct cmp{
bool operator()(int a, int b){
return a > b; // 小根堆,a比b小返回true
}
};
int main(){
priority_queue<int, vector<int>, cmp> pq;
pq.push(5);
pq.push(2);
pq.push(7);
while(!pq.empty()){
cout << pq.top() << " ";
pq.pop();
}
return 0;
}
```
2. 使用greater模板类
STL中提供了一个greater模板类,可以用来定义小根堆。在定义优先队列时,将比较函数的类型设置为greater<T>即可。
```cpp
#include <queue>
using namespace std;
int main(){
priority_queue<int, vector<int>, greater<int>> pq;
pq.push(5);
pq.push(2);
pq.push(7);
while(!pq.empty()){
cout << pq.top() << " ";
pq.pop();
}
return 0;
}
```
阅读全文