【问题标题】:Comparisons in AVL Tree consisting of pointers to objects由指向对象的指针组成的 AVL 树中的比较
【发布时间】:2014-10-30 12:38:03
【问题描述】:

我有一个 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;
}

但是比较忽略了我的重载运算符,仍然使用指针的地址。有什么方法可以强制比较使用我的运算符,就像它们对普通对象一样?

【问题讨论】:

  • 不要(仅)重载&lt;,将比较器类作为另一个模板参数传递给树模板。有关详细信息,请参阅 std::map。
  • 我建议你看看这个stackoverflow.com/questions/301330/…

标签: c++ pointers operator-overloading binary-search-tree avl-tree


【解决方案1】:

这是可能的,但有点不重要。

完成这项工作的常用方法是传递一个函数,树将使用该函数来比较存储的内容。您可以为此函数提供默认值,通常使用std::less&lt;T&gt; 作为默认值,但如果用户选择这样做,则允许用户传递其他内容。当然,你需要重写你的代码来使用它而不是直接使用&lt;

template <class T, class Less=std::less<T>>
class AvlTree {

public:

    void insert( const Comparable & x, AvlNode * & t )
    {
        if( t == nullptr )
            t = new AvlNode( x, nullptr, nullptr );
        else if( Less(x, t->element) )
            insert( x, t->left );
        else if( Less(t->element, x) )
            insert( x, t->right );

        balance( t );
    }

    // ...
};

...那么对于指针树,您需要指定一种合适的方式进行比较:

template <class T>
struct LessPtr { 
    bool operator()(T *a, T *b) { 
        return *a < *b;
    }
};

...并在您实例化树时传递它的实例化:

AvlTree<MyClass *, LessPtr<MyClass>> my_tree;

现在你的树应该比较指向的对象而不是指针本身。

当然,还有其他方法可以做到这一点。在某些情况下冒着做错事的风险,您可以(例如)使用模板特化来定义指针的特化,以比较指针对象而不是指针本身。如果用户尝试创建 MyObject ** 的树,这可能(可能)仍然会遇到问题。至少对我来说,这里可能出现的问题看起来很严重,但我建议不要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多