为什么 STL 优先级队列错误地对我的 class 个对象进行排序

Why is STL priority queue incorrectly sorrting my class objects

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

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,所以它的值为 undefined/random。

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

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;