2015-11-19 130 views
0

我正在嘗試創建一個採用優先級隊列並反轉優先級的類。我包含一個bool operator<()函數作爲該類的成員函數,但無論如何構造此函數,運算符似乎都不會被重載。運營商overloader沒有產生影響

這裏是我的類:

template<typename T> 
class MinPQ{ 

public: 

    bool empty() const { 
     return pq.empty(); 
    } 

    unsigned int size() const { 
     return pq.size(); 
    } 

    void push(const T& element){ 
     pq.push(element); 
    } 

    const T& min() const { 
     return pq.top(); 
    } 

    void remove_min(){ 
     pq.pop(); 
    } 

    bool operator<(const T& element) const { 
     return pq < element; 
    } 

private: 

    priority_queue<T> pq; 
}; 

編輯

我也試圖改變重載函數以下,不undertsand這是爲什麼也不工作。

bool operator<(const T& element){ 
    return this < element; 
} 
+0

您是如何使用操作符的? – TartanLlama

+0

我剛剛開始研究優先級隊列,我認爲如果我要包含一個運算符重載成員函數,每當元素被推入隊列時,優先級隊列會自動按照這個overloader進行排序? – KOB

+1

成員操作符定義將作爲參數(默認情況下)_class_類型。您的運營商正在努力將優先隊列與該隊列中的一個元素進行比較。你應該比較喜歡的東西。 –

回答

1

您的operator<是沒有意義的。它唯一能做的就是將MinPQ<T>對象與T對象進行比較。如果要比較兩個T對象,你應該這樣做:

1)如果模板類型T只能取的種類屈指可數,你可以明確地寫比較運營商每種類型:

bool operator<(const T& lhs, const T& rhs) 
{ 
    return lhs > rhs; 
} 

注意:每個operator<應該是非成員函數。或者帶有單個參數的類T的成員函數。

2)寫一個比較仿函數:

template <class T> struct CompareT 
{ 
    bool operator()(const T& lhs, const T& rhs) const 
    { 
     return lhs > rhs; 
    } 
}; 

然後聲明pq成員如下:

priority_queue<T, std::vector<T>, CompareT<T>> mq; 

3)如果你想簡單地逆優先級,你可以簡單地使用std::greater類:

priority_queue<T, std::vector<T>, std::greater<T>> mq; 
+0

你的選擇1是我最初想到的,但是我得到一個錯誤,說它只需要一個參數? 我明白選項2和3,但是在這種情況下,我必須使用成員函數 – KOB

+1

來完成。您可以閱讀如何編寫關係運算符:http://en.cppreference.com/w/cpp/language/operators – AlexStepanov

+1

我的意思是你應該寫非成員函數。我會解決我的答案。 – AlexStepanov