为什么 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;
我已经重载了 <
运算符,但每次程序 运行 我的 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;