2009-08-06 47 views
1

從cplusplus.com:STL集的兩個元素何時被認爲是相同的?

template < class Key, class Compare = less<Key>, 
     class Allocator = allocator<Key> > class set; 

「比較:比較類:A類,是以相同的類型容器元件的兩個參數,並返回一個布爾表達式排版(A,B),其中補償是這個比較類的一個對象,a和b是容器的元素,如果在嚴格的弱排序操作中將a放置在比b更早的位置,它將返回真,它可以是實現函數調用操作符的類或一個指向函數的指針(參見構造函數舉例),默認爲less,這與應用小於運算符(a < b)相同返回 set對象使用此表達式來確定元素的位置在th e容器。 「

假設比較類用於決定兩個對象中的哪一個是」較小「還是」較小「,那麼類將如何檢查兩個對象是否是兩個元素是相等的(例如,以防止插入相同的元素兩次)?

我可以想象這裏有兩種方法:一種是在後臺調用(a == b),但不提供重寫此比較的選項( (默認值越小越好)對我來說似乎不太對,另一種假設是(a == b)==!(a < b)& &!(b < a);那就是如果兩者都不相等,則認爲兩個要素相等是比其他的「少」,但不知何故,這也不適合我,因爲比較可以是任意複雜類的對象之間的任意複雜的布爾函子。

那麼它是如何做到的?

回答

3

不是一個確切的重複,但第一個答案here回答您的問題

你的第二個猜測的行爲是正確的

0

你的第二個選擇是正確的。爲什麼感覺不對?如果平等測試與您給出的等式不一致,您會怎麼做?

3

標準庫關聯容器中等價鍵的術語定義,不等於本身

由於並非所有setmap實例使用less,但可以使用一個通用的比較操作有必要在這一個比較函數來定義等價而不是試圖引入一個獨立的平等概念。

通常,兩個鍵(​​和k2)以相關聯的容器使用比較功能comp是等價的,當且僅當:

comp(k1, k2) == false && comp(k2, k1) == false 

在使用std::less用於類型的容器不具有該具體的std ::專業化少,這意味着相同的:

!(k1 < k2) && !(k2 < k1) 
1

你的錯誤是假設「的比較可以是任意複雜的布爾函子」。它不能。

std::set需要部分排序,以便a<b暗示!(b<a)。這排除了大多數二進制布爾函子。因此,我們可以討論a和b在該順序中的相對位置。如果a<b,則位於b之前。如果b<a,b先於a。如果既沒有a<b也沒有b<a,那麼a和b在排序中佔據相同的位置並且因此是等同的。

相關問題