如何在main中重载运算符>泛型类.cpp

How to overload operator> for a generic class in main.cpp

本文关键字:gt 泛型类 cpp 运算符 重载 main      更新时间:2023-10-16

我有一个问题,希望你知道答案。我有一个通用堆类。让我们称之为CHeap。在这个类中,由于堆的性质,我需要比较组件(例如Heap[i]>Heap[j])。这里Heap数组。

如果我在main.cpp:中定义这样的变量

cHeap <int> myHeap;

那么我就没有问题了。但如果我有一个数据结构,让我们说:

struct S{
 int data;
 int code;
}

我定义:

cHeap <S> myHeap;

那我就有问题了。例如,我希望对代码值进行比较。换句话说:Heap[i].code>Heap[j].code

但是,正如我之前所说,这是一个泛型类,我不想在我的代码中(在我的CHeap类中)使用它。我是否可以在我的main.cpp中为CHeap重载运算符>?换句话说,拥有:

bool operator>(const S& s1, const s& s2){
    return s1.code > s2.code;
}

在我的main.cpp中,并将其链接到CHeap类?

类似于我们使用STL的*priority_queue*:时所做的操作

priority_queue <S, vector <S>, greater <S> > myPQ;
bool operator>(const S& s1, const s& s2){
    return s1.code > s2.code;
}

感谢

您可以在S结构中写入operator>

struct S{
 int data;
 int code;
 bool operator>(const S& other) { ... }
}

此外,您还可以向CHeap类添加另一个模板参数,该参数将比较两个Type:

template<typename T, typename Compare> 
class CHeap
{
    Compare comparer;
};

使用comparer:进行值比较

if(comparer(object1, object2)) {} // If object1 is greater than object2

把你的Compare论点写成这样:

class SComparer
{
public:
    bool operator()(const S& s1, const s& s2) const { return s1.code > s2.code; }
}

您可以定义S::operator>()重载(这是一种常见的做法)

struct S
{
    int data;
    int code;
    bool operator>(const struct S & aux) const
    {
        return this->code > aux.code;
    }
};

所以,你可以使用它:

if (Heap[i] >Heap[j])
{
    ......
}