2013-12-17 33 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