2014-01-10 79 views
0

我使用用於C++ STL中的SORT的自定義比較函數?

 typedef pair < long , pair <bool ,long > > t; 
     vector <t> time ; 

,我需要使用std :: sort()函數來排序上述載體,但使用一個定製的比較函數。我寫了一個版本但沒有正常工作。你能指出我的錯誤嗎?

  bool comp (const t &a , const t &b){ 

     if (a.first < b.first) 
     return a.first > b.first ; 
     else if (b.first < a.first) 
     return b.first > a.first ; 
     else if (a.first == b.first) 
     { 
       if (a.second.first == false && b.second.first == true) 
       return a.first > b.first ; 
      else if (a.second.first == true && b.second.first == false) 
      return b.first > a.first ; 
      else 
      return a.first > b.first ; 
     } 
     } 


     inside main(){ 
     sort (time.begin() ,time.end() ,comp) ; 
     } 

定製案例:

 Before sorting : vector time 
     10 1 1 
     100 0 1 
     100 1 2 
     200 0 2 
     150 1 2 
     500 0 2 
     200 1 2 
     300 0 2 
     After Sorting : 
     10 1 1 
     100 0 1 
     100 1 2 
     150 1 2 
     200 0 2 
     200 1 2 
     300 0 2 
     500 0 2 

在此先感謝。

+0

這個問題可以使用英文描述,確切地說你需要如何排序這些東西 - 即:什麼使得一個「t」比另一個「少」。代碼似乎對這個問題有點困惑。 – cHao

+0

請正確縮進您的代碼,目前無法讀取。 –

回答

1

您的比較函數沒有定義排序。實際上, 似乎在任何時候都會返回a.first != b.first

我不確定你想要什麼樣的自定義順序。標準 有序的std ::一雙會導致類似:

bool 
comp(t const& a, t const& b) 
{ 
    if (a.first != b.first) 
     return a.first < b.first; 
    else if (a.second.first != b.second.first) 
     return a.second.first < b.second.first; 
    else 
     return a.second.second < b.second.second; 
} 

它實際上更復雜一些,因爲它使用的唯一比較 運營商是<。但如果<!=都是 可用,並且行爲正常,則結果與上面的 相同。

你可以很容易地採用這個來比較你想要的任何 順序的元素;如果您想要反轉 元素之一的訂單,請將<替換爲>

最後,false對比布爾值 值小於true

+0

我會說它返回false爲a.first!= b.first。 –

+0

@KitFisto在進一步研究它時,我會說它總是返回false。如果'a.first == b.first',所有返回路徑都是'a.first> b.first'或'b.first> a.first'。 (我仍然無法弄清他想做什麼。) –

3

它應該是:

if (a.first < b.first) 
    return true 
else if (b.first < a.first) 
    return false; 
// etc. 

在你的版本,它會返回在這兩種情況下錯誤的。

+1

澄清:如果'a.first b.first'將是錯誤的(反之亦然),除非'<' and '>'被定義爲奇怪。 – cHao