2013-12-17 91 views
1

我有一个问题,我希望你知道答案。我有一个通用的堆类。让我们叫它CHeap。在本课中,由于堆的性质,我需要比较组件(例如Heap[i]>Heap[j])。这里阵列如何重载operator>在main.cpp中的泛型类

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

cHeap <int> myHeap; 

然后我没有问题。但是,如果我有一个数据结构,让我们说:

struct S{ 
int data; 
int code; 
} 

和我定义:

cHeap <S> myHeap; 

然后我有问题。例如,我想要比较代码值。换句话说:Heap[i].code>Heap[j].code

但是,正如我之前所说的,这是一个通用类,我不希望有一个在我的代码(在我便宜类)。反正是有,我可以超载运营商>便宜的main.cpp? 换句话说有:

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

,并将其链接到便宜类?

喜欢的东西,当我们使用STL的* priority_queue *我们做什么:

priority_queue <S, vector <S>, greater <S> > myPQ; 

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

?!

感谢

+0

为什么它必须位于main.cpp文件中?你提出的问题是什么?还有什么意思*链接*的东西到一个类? – Shoe

+0

@Jefffrey:因为如上所述,CHeap是一个通用类。关于链接,我可能使用了错误的词。我的意思是像我们在priority_queues中所做的一样。这就是为什么我最后写了它来澄清我在找什么。如果你知道一个更好的词,请让我知道:-) – Nejla

+0

我问了3个问题,你回答了一个,我甚至不知道你回答了哪一个。 – Shoe

回答

2

您可以在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; } 
} 
+0

几乎正确。现在转换成C++。 – juanchopanza

+0

这不是'公共课堂'。 – Shoe

+0

@MohammadRB:谢谢。这正是我所期待的。 :-) – Nejla

1

可以定义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]) 
{ 
    ...... 
} 
+0

它看起来像OP希望能够用不同的排序标准实例化不同的堆。 – juanchopanza

+1

他提供的那个有什么问题?您的会员功能完全等同于他的免费功能。 – Shoe

+0

谢谢@tioPepe。 – Nejla