c++ 优先队列 自定义类型
时间: 2025-04-20 10:30:12 浏览: 22
### 使用自定义类型与优先队列
为了使 `priority_queue` 支持自定义数据类型,需重载 `<` 运算符或提供第三个模板参数作为比较函数对象。当仅存储基本类型的元素时,默认的大顶堆行为通常满足需求;然而对于复杂的数据结构,则需要指定排序逻辑。
#### 方法一:通过运算符重载实现
下面的例子展示了如何创建一个名为 `Person` 的类,并基于年龄属性构建最大堆:
```cpp
#include <iostream>
#include <queue>
using namespace std;
class Person {
public:
string name;
int age;
Person(string n="", int a=0):name(n),age(a){}
// Overload the '<' operator to compare by 'age'
bool operator<(const Person& p) const {
return this->age < p.age;
}
};
void showQueue(priority_queue<Person> q){
while (!q.empty()){
cout << "Name: " << q.top().name << ", Age:" << q.top().age << endl;
q.pop();
}
}
```
上述代码片段中,`operator<()` 被重新定义以便按照成员变量 `age` 对象实例进行降序排列[^1]。
#### 方法二:利用仿函数(Functor)
如果不想修改原有类定义中的操作符,可以采用另一种方式——即传入一个额外的比较器来决定顺序关系。这里展示了一个最小堆版本的人名列表案例:
```cpp
// Define comparator as struct with () operator overloaded.
struct CompareByName {
inline bool operator() (const Person& lhs, const Person& rhs){
return lhs.name > rhs.name; // For min heap based on names
}
};
...
priority_queue<Person,vector<Person>,CompareByName> pq_min_name;
pq_min_name.push(Person("Alice", 28));
pq_min_name.push(Person("Bob", 35));
showQueue(pq_min_name);
```
这段程序里引入了新的结构体 `CompareByName` 来充当比较准则,它会依据字符串字典序升序组织人员记录[^2]。
#### 完整示例综合应用两种方法
最后给出一段完整的测试代码,其中既包含了按年龄的最大堆也涵盖了依姓名字母表次序建立的小根堆:
```cpp
int main(){
priority_queue<Person> pq_max_age; // Max Heap By Age
pq_max_age.push(Person("Charlie", 47));
pq_max_age.push(Person("David", 61));
cout << "\nMax Heap Based On Ages:\n";
showQueue(pq_max_age);
priority_queue<Person,vector<Person>,CompareByName> pq_min_name; // Min Heap By Name
pq_min_name.push(Person("Eve", 29));
pq_min_name.push(Person("Frank", 32));
cout << "\nMin Heap Based On Names:\n";
showQueue(pq_min_name);
return 0;
}
```
此段完整代码实现了两个不同规则下的优先级队列管理机制,分别用于处理不同类型的信息排序需求[^3]。
阅读全文
相关推荐


















