我有一个结构节点,我想定义运算符<为了在我的斐波那契堆中使用节点。
这是我的简单节点:
struct Node {
int key, data;
Node* parent;
Node(int aKey, int aData):key(aKey),data(aData),parent(nullptr) {}
bool operator<(const Node* n) const {
return n->key > key;
}
}
确保运营商&lt;工作,我测试了它:
Node* n = new Node(100, 0);
Node* m = new Node(1, 1);
cout << (n < m) << endl;
cout << (n > m) << endl;
我得到的答案是:
1
0
但是,我怀疑这是错误的,所以我稍微修改了我的节点:
struct Node {
int key, data;
Node* parent;
Node(int aKey, int aData):key(aKey),data(aData),parent(nullptr) {}
bool operator<(const Node* n) const {
cout << "comparing.... " << endl;
return n->key > key;
}
}
然后我又做了同样的测试,“比较....”从未打印出来。因此,出于某种原因,当我尝试比较节点时,它不使用我定义的比较器运算符。相反,在我看来比较指针。我该如何解决?我知道“替代”将是创造类似的东西:
struct NodeComp(Node* a, Node* b) {
....
}
但是,这对我实现Fibonacci Heap不起作用,最终我想将节点插入斐波那契堆中。
感谢。
答案 0 :(得分:2)
正常使用operator<
涉及传递const引用参数,而不是指针:
bool operator<(const Node& n) const { // Note the & instead of the *
return n.key > key;
}
然后,您可以先通过解除引用来比较Node
指针:
cout << (*n < *m) << endl;
无论如何,如果您只定义了>
,那么您将不会让<
工作 - 您需要如果您希望能够编译operator>
等表达式,还会重载(*n > *m)
。
答案 1 :(得分:1)
如果要重载operator<()
,则需要将其作为类的成员:
bool operator<(Node &n);
它也可以是一个独立的功能:
// this function should be made a friend of you class if you need to
// access private class members
bool operator<(Node &left, Node &right);
请注意,对象的引用将传递给您的函数,而不是指针。
您需要将代码重写为:
cout << (*n < *m) << endl;
cout << (*n > *m) << endl;