priority_queue 的重载
时间: 2025-04-30 19:18:44 浏览: 28
### C++ `priority_queue` 运算符重载实例
在 C++ 中,标准库提供了 `std::priority_queue` 容器适配器,默认情况下它是最大堆。为了改变其行为(例如创建最小堆),可以通过自定义比较函数实现。
#### 自定义比较函数的方式之一:通过 lambda 表达式
如果只需要简单修改优先级队列的行为而不需要完全重新定义类,则可以利用 Lambda 函数作为第三个参数传递给模板构造函数:
```cpp
#include <queue>
#include <vector>
struct Node {
int value;
};
// 创建一个小顶堆
auto cmp = [](Node a, Node b) -> bool { return a.value > b.value; };
std::priority_queue<Node, std::vector<Node>, decltype(cmp)> minHeap(cmp);
```
此方法适用于临时需求调整的情况[^1]。
#### 自定义比较结构体/类方式
对于更复杂的需求或希望保持代码清晰度时,建议定义一个新的比较结构体或类,并将其用于指定优先级队列中的元素顺序关系:
```cpp
#include <iostream>
#include <queue>
using namespace std;
class CustomCompare {
public:
bool operator()(const pair<int,int>& p1,const pair<int,int>& p2){
// 小于号表示构建大根堆;大于号则相反
return p1.second<p2.second;
}
};
int main(){
priority_queue<pair<int,int>, vector<pair<int,int>>,CustomCompare> pq;
pq.push({0,7});
pq.push({1,9});
pq.push({2,8});
while (!pq.empty()){
cout << "("<<pq.top().first<<","<<pq.top().second<<") ";
pq.pop();
}
return 0;
}
```
上述例子展示了如何基于键值对建立一个按照第二个成员变量降序排列的大根堆[^2].
#### 关联问题探讨
当涉及到运算符重载时,实际上是指向了特定类型的对象之间的操作逻辑定制化处理过程,在这里主要是指定了不同节点间大小关系判断准则。这不仅限于内置数据类型,也支持用户自定义的数据结构。
阅读全文
相关推荐


















