2017-09-23 201 views
0

嗨,我正在解決某種排序算法問題。在C++ std :: priority_queue中反轉字母順序的簡單方法?

我使用C++ STL priority_queue與STL隊列頭排序字符串輸入與反向字母順序與一些整數。

我知道有一個簡單的想法來實現像這樣的優先級隊列的整數排序的增量順序。

#include <queue> 

priority_queue<int> pq; 
int arr[5] = {4,3,2,1,5}; 

for(int i = 0; i < 5; i++) 
    pq.push(-arr[i]); 
while(!pq.empty()) { 
    cout << -pq.top() << endl; 
    pq.pop(); 
} 
//the result may be 1, 2, 3, 4, 5 

或者我可以用更少的操作實現這樣

priority_queue<int, vector<int>, less<int>> pq; 
int arr[5] = {4,3,2,1,5}; 

for(int i = 0; i < 5; i++) 
    pq.push(arr[i]); 
while(!pq.empty()) { 
    cout << pq.top() << endl; 
    pq.pop(); 
} 
//the result may be 1, 2, 3, 4, 5 

問題是我使用複雜的數據結構是這樣

priority_queue<pair<int, pair<int, pair<int, string>>>> pq; 

我知道我可以解決這個問題, priority_queue運算符重載。

但是有沒有簡單體面的方式來實現逆序字母順序沒有實現這樣的運算符重載?

回答

2

無論如何,您絕對不應該在實際代碼中使用嵌套對的複雜數據結構。它使代碼難以理解。什麼是pq.top().second.second.first

如果你的結構複雜,再定義一個結構類似這樣的所需成員的(但有意義的成員姓名):

struct datastructure 
{ 
    int member1; 
    int member2; 
    int member3; 
    std::string member4; 
}; 

那麼你應該定義一個比較操作。它實際上只有幾行代碼,它使您的代碼更具可讀性。它可以是一個嵌套struct如果你喜歡...

struct datastructure_comp 
{ 
    bool operator()(const datastructure &lhs, const datastructure &rhs) const 
    { 
     return lhs.member1 < rhs.member2; 
    } 
}; 

據我所知,如果你只是想扭轉你的複雜的數據結構的順序,你可以使用std::greater而不是默認std::less(假設所有的領域都要按相反的順序進行比較,而不僅僅是第一個領域)。

好吧,如果你想仍使用簡單對,那麼你可以做這樣的事情:

class datastructure 
{ 
    std::pair<int, std::pair<int, std::pair<int, string>>>> data; 

public: 
    int GetValue1() const { return data.first; } 
    void SetValue1(int value) { data.first = value; } 

    // other access function here... 
}; 

然後定義比較是微不足道的:

struct datastructure_comp 
{ 
    bool operator()(const datastructure &lhs, const datastructure &rhs) const 
    { 
     return lhs.data > rhs.data; // reversed sort... 
    } 
}; 
+0

謝謝,但那個答案不是我想要的。我沒有問你如何製作自定義數據結構和比較運算符。我很好奇如何使用像pq.push(-arr [i])這樣的優先級隊列來製作簡單的反向字母排序順序。注重標題請 – JunsungChoi

+1

@JunsungChoi那麼你不能簡單的做到這一點,因爲你的數據結構並不簡單。 – Sopel

+0

@JunsungChoi你的**所需的答案是使用'std :: greater',正如我在答案中已經提到的那樣。然而,**專業開發人員**不會使用3級深的'std :: pair',因爲它會使代碼難以理解。 – Phil1970