我找不到有关如何在优先级队列中订购对象的任何信息。我试过这个:
class Person {
...
public:
bool operator<(const Person& p) {
return age < p.age;
}
}
int main() {
priority_queue<Person*> people;
people.push(new Person("YoungMan", 21));
people.push(new Person("Grandma", 83));
people.push(new Person("TimeTraveler", -5000));
people.push(new Person("Infant", 1));
while (!people.empty()) {
cout << people.top()->name;
delete people.top();
people.pop();
}
它应该根据年龄给予优先级(老年人获得更高的优先级,因此将队列排在第一位),但它不起作用。但是我得到了这个输出:
Infant
Grandma
TimeTraveler
YoungMan
我不知道这是什么命令,但它绝对不是年龄。
答案 0 :(得分:7)
priority_queue<Person*>
实际上是基于使用比较器Person
比较std::less<Person*>
对象的内存地址而进行的。
声明priority_queue<Person>
代替您根据您提供的operator<
订购。
或者如果你坚持使用指针(由于某种原因),那么声明为:
auto age_comp = [](const std::unique_ptr<Person>& lhs, const std::unique_ptr<Person>& rhs) -> bool {
return *lhs < *rhs;
};
std::priority_queue<std::unique_ptr<Person>, std::vector<std::unique_ptr<Person>>,
decltype(age_comp)> people(age_comp);
// note: must pass age_comp to std::priority_queue constructor here as
// lambda closure types have deleted default constructors
请注意,这是使用智能指针而不是原始指针,前者在现代C ++中更常用 - 除非你有充分的理由,否则不要使用原始指针。
另外,operator<
的{{1}}应该Person
指定,因为它不应该在任何时候更改它所属的const
对象 - {{1的比较符期望Person
,如果std::priority_queue
没有const
规范,可能会抛出错误。所以,将operator<
改为:
const