我有一个使用模板的AVL树,假设节点对象是可比较的,因此直接进行比较,而不是比较与对象关联的某种键:
void insert( const Comparable & x, AvlNode * & t )
{
if( t == nullptr )
t = new AvlNode( x, nullptr, nullptr );
else if( x < t->element )
insert( x, t->left );
else if( t->element < x )
insert( x, t->right );
balance( t );
}
为了使这个工作正常,我在我的类中实现了一个重载的 < 操作符,它使用类的成员变量来比较这两个对象:
bool operator <(const myClass & myObject) const
{
return myVariable < myObject.myVariable;
}
当我创建一个对象的AVL树时,这个工作完美:
AvlTree<myClass> myTree;
然而,当我创建一个指向对象的AVL树时,它无法工作:
AvlTree<myClass*> myTree;
树内部的比较似乎是比较指针的地址,而不是成员变量。我尝试在我的指针类中实现了一个类似的重载 < 运算符:
bool operator <(const myClass *& myObject) const
{
return myVariable < myObject->myVariable;
}
但是这些比较忽略了我的重载运算符,并且仍然使用指针的地址。有没有办法强制比较运算符使用我的运算符,就像它们与普通对象一样?
<
,而是将比较器类作为树模板的另一个模板参数传递。请参阅 std::map 以获取详细信息。 - n. m.