为什么STL优先级队列错误地分配了我的类对象

Why is STL priority queue incorrectly sorrting my class objects

本文关键字:我的 对象 分配 STL 优先级 队列 错误 为什么      更新时间:2023-10-16

我已经重载了<运算符,如图所示,但每次运行程序时,我的类对象似乎都是随机排序的。

class Node
{
int decimal_value
public:
Node(int decimal) : decimal_value(decimal)
{}
friend bool operator<(const Node& p1, const Node& p2);
};
bool operator<(const Node& p1, const Node& p2)
{
return p1.decimal_value < p2.decimal_value;
}
int main()
{
Node* n1= new Node(5);
Node* n2 = new Node(4);
priority_queue<Node*> my_q;
my_q.push(n1);
my_q.push(n2);
}

这可能是因为我使用了指向节点的指针而不是节点本身吗?如果是这样,我该怎么解决?

priority_queue<Node*> my_q;将比较类型为Node*的元素进行排序,它不会为您取消引用这些指针并调用重载运算符。不相关指针的比较有

un定义的行为,但在您的情况下不会产生有用的结果。

当你修复这个错误时,会有另一个错误:你永远不会初始化decimal_value,所以它的值是未定义的/随机的。

一种解决方案是明确指定一个比较器:

struct MyComparator {
bool operator()(const Node*l, const Node*r) const {
return l->decimal_value < r->decimal_value;
}
};
std::priority_queue<Node*, std::vector<Node*>, MyComparator> q;