【发布时间】:2015-12-15 14:50:08
【问题描述】:
我正在用 C++ 实现 AVL 树。为了保持简洁(并且为了练习),我试图为树的节点重载比较运算符。
这就是我希望树的 find 函数的外观:
node* find(int key)
{
node* currentNode = root;
while (currentNode)
{
if (key < *currentNode)
{
currentNode = currentNode.getLeftChild();
}
else if (key > *currentNode)
{
currentNode = currentNode.getRightChild();
}
else
{
return currentNode;
}
}
return nullptr;
}
在这种情况下,我可以重载运算符以将int 与node 进行比较,如下所示:
bool operator<(const int& lhs, const node& rhs) // friend of node
{
return lhs < rhs.key;
}
但这似乎只适用于int < node,不适用于node < int。我需要为node < int 定义一个单独的函数吗?
我还想将此函数模板化,以便我可以将任何东西(本身具有比较运算符)与nodes 进行比较:
template<typename T> bool operator<(const T& lhs, const node& rhs) // friend of node
{
return lhs < rhs.key;
}
同样,这适用于T < node,但不适用于node < T。我需要为node < T定义一个函数以及上面的函数吗?
TL;DR
如果我将运算符重载为bool operator<(const foo& lhs, const bar& rhs),我是否还需要定义bool operator<(const bar& lhs, const foo& rhs) 以便操作数可以任意选择? template<typename T> bool operator<(const foo& lhs, const T& rhs)这样的模板函数也是这样吗?
抱歉,如果我在这里回答了我自己的问题,但我能找到的关于运算符重载的唯一资源只显示了对两个参数使用相同类型的示例。我只是想确保我这样做是正确的,希望下次有人搜索此问题时会出现此帖子。
【问题讨论】:
-
如果您想对这些类型进行可互换的比较,也许在它们之间定义一个转换运算符是有意义的?
-
好主意!我从来没有想过。
标签: c++ templates comparison operator-overloading avl-tree