2013-01-04 66 views
2

我很難在這裏理解其他人的代碼。 如果有人幫我,我會很感激。對象與排序比較。 C++

比方說,有一個對象數組:vpair_list和這個vpair_list有一個類型vpair。因此,這將是這樣的:

class vpair 
{ 
public: 
    int vid; 
    int vlabel; 
}; 

bool operator < (const vpair& x, const vpair& y); 

vpair* vpair_list; 
vpair_list = new vpair[25]; 
.. 
sort(vpair_list, vpair_list+j); 

我從知道是sort()比較陣列vpair_list的每個元素和排序。

事情是,我不明白如何排序工作,因爲對象vpair有兩個不同的屬性。

排序工作是否像比較每個屬性(vidvlabel)或....?我認爲排序應該是通過比較特定的字段或屬性(這裏是vidvlabel)來完成。

但是這段代碼沒有任何關係,似乎只是比較整個對象。有人能告訴我這是如何工作的嗎?

預先感謝您。

+0

通過調用操作員完成排序。你已經聲明瞭它,但是你還沒有定義它。 –

+1

它使用'運算符<',但是實現... – Yuushi

+0

非常感謝你們。但我的意思是'運營商'比較哪個領域。它是否比較vid和vlabel,如果是這樣,如果(vpair_list [0] .vid vpair_list [1] .vlabel)會發生什麼?它如何進行排序? – WonKook

回答

0

是否分揀工作比較喜歡每個屬性(VID和vlabel)或....?

它發生了你到底想要它發生。

默認情況下,人們已經提到過,<運算符被各種排序算法用來按照運算符的排列順序排列中的元素。然而,對於類/結構有沒有默認的方式來比較它們的意思你的程序員有它的代碼。

這就是

bool operator < (const vpair& x, const vpair& y); 

是。它僅僅是一個聲明,用於定義程序員提供的用於比較2 vpair訂單的功能。程序員使用他的規則來決定並最終返回truefalse。這用於排序。

所以你可以決定究竟是如何你想排序。

bool operator < (const vpair& x, const vpair& y) 
{ 
    if(x.vid != y.vid) 
     return x.vid<y.vid; 

    return x.vlabel <y.vlabel; 
} 

這將按ID的升序排序,如果相等,則按vlabel的升序排序。

+0

我很欣賞你的答案。乾杯〜 – WonKook

+0

@ user1643168很高興我能幫上忙! –

2

的標準方法:

class vpair 
{ 
public: 
    int vid; 
    int vlabel; 
}; 

bool operator < (vpair const& x, vpair const& y) 
{ 
    return std::tie(x.vid, x.vlabel) < std::tie(y.vid, y.vlabel); 
} 

當然,操作者可以是一個構件:

class vpair 
{ 
    int vid; 
    int vlabel; 
public: 
    bool operator < (vpair const& y) const 
    { 
     return std::tie(vid, vlabel) < std::tie(y.vid, y.vlabel); 
    } 

}; 
+0

謝謝sehe。所以它同時比較了vid和vlabel?如果一個更大,另一個更小並且它如何被分類呢? – WonKook

+0

第一個元組優先。爲了逆轉優先級,使用'std :: tie(vlabel,vid)' – sehe

+0

使用'std :: tie'會按照字典順序進行比較,也就是比較第一個元素(在本例中爲'vid'),如果它們是相等,它會比較第二個元素(在這種情況下,'vlabel')。 – Yuushi

1

排序,默認情況下,比較與operator<。您可以實現此操作爲您的類,像這樣:

public: 
bool operator < (const vpair& other) const 
{ 
    return (vid < other.vid); // Uses vid but this can be vlable or something else. 
} 

如果你沒有爲operator<與您使用的類的過載,你可以在一個比較函數總是通過爲std::sort的第三參數:

bool compare_func(vpair i,vpair j) { return (i.vid < j.vid); } 
sort(vpair_list, vpair_list+j, compare_func); 
+0

非常感謝你Gunther – WonKook

+0

+1顯示一個免費函數謂詞 – sehe