C 通用树按两个标准进行比较

C++ Generic Tree Comparing by Two Criteria

本文关键字:两个 标准 比较      更新时间:2023-10-16

我开始在通用树上工作,而我是C 的新手。我希望能够形成两个相同元素的树,但是在每棵树中以不同的方式进行比较。从我可以看出我是否超载<然后,我只能定义一个功能。我以为我也许可以将指针转到功能,但我觉得这是错误的方法。

template<class T, int (*Comp)(T*, T*)> class Tree 

尝试这样做的建议是什么?谢谢

no,您做不是想要指定指向函数的指针(这样做将禁止使用函数对象,这通常是可取的(。

模板参数通常应为类型参数 - 在这种情况下,您几乎肯定要提供std::less<T>的默认值,因此看起来像这样:

template <class T, class Comp = std::less<T>>
class Tree {
     // Implementation here.    
};

this will 允许对函数指针进行实例化,但是(如上所述(也将支持函数对象。

注意,但是,模板参数仅指定您用于进行比较的事物的类型。在典型的情况下,您需要该类型的实例才能做某事。构造对象时,通常会指定此内容,因此您将拥有类似的东西:

template <class T, class Comp = std::less<T>>
class Tree {
public:
    Tree(Comp c = Comp()) : c(c) {}
    bool insert(T value) {
        if (c(value, root->value)) // if value < root->value
            // ...
        else if (c(root->value, value)) // if root->value < value
    }
private:
    struct Node { 
        T key;
        Node *left , *right;
    } *root;
    Comp c;     
};

因此,模板参数为进行比较的事物指定类型。我们给它一个std::less<T>的默认值;这将适用于内置类型,以及使a<b成为合法表达的其他任何事物(假设我们希望可以进行比较(。如果我们提供其他类型,则必须使用它来确保它定义严格的弱点。

然后,我们将比较类型的实例传递给构造函数。同样,我们指定该类型的默认构造实例的默认值。对于函数对象类型(例如std::less<T>std::greater<T>(的常见情况,默认的构造对象将做正确的事,因此我们需要的一切。

对于不太常见的情况,想要使用指针指向函数,我们必须将正确的类型指定为模板参数,,我们必须将指针传递给正确的功能构造函数。