2012-06-21 71 views
0

我知道在對地圖進行排序時,使用相等性而不是等價性是不好的做法。在地圖比較中使用平等

//Equality 
bool isEqual(const A& a1, const A& a2) 
{ 
    return a1 == a2 ; 
} 

不過,我有一對夫婦,我要地圖非常複雜的類的,我已經定義的==操作符這些類,而不是運營商<。

任何人都可以給我很好的理由不使用operator ==進行地圖比較嗎?我想不出一個例子,它會在我的課堂中崩潰(如果需要,我可以添加我的課程源代碼)

另外,我應該咬一口建造並編寫新的操作員<: - /?

我會爲我的地圖做這樣的事情。

std::map<A,B,isEqual> ex1; 

也將

ex1.find(A); 

現在使用的平等,而不是等價?

+0

你想實現什麼?我無法理解這個要求。 – iammilind

+0

@iammilind我有兩個班(說A和B)組成新班(說C,D,E,F ...),但有很多不同的組合來做到這一點。我需要確保沒有類型A和B的重複項,所以我需要找到重複項並將其刪除。希望這是有道理的... – MWright

+0

從哪裏刪除它們? 'maps'和'sets'不能有重複。 – juanchopanza

回答

3

因爲std::map,std::set和它們的multi兄弟姐妹是按照C++標準排序的結構,並且等於不能用於排序。另一方面,嚴格的弱訂貨可以用來確定平等。

至於爲什麼要對結構進行排序,標準要求插入和查找是對數複雜度,這可以通過使用二叉查找樹來實現。在這種結構中進行平等比較的唯一用途是測試元素的存在。

如果只有平等比較,那麼元素查找將不得不遍歷結構,每次進行比較直到找到元素,從而導致線性時間複雜度。

如果你這樣做

std::map<A,B,isEqual> ex1; 

然後在地圖的比較並不能滿足strict weak ordering,所以地圖的既不是排序還是元素查找會工作。所以我不只是壞習慣,它根本不起作用。你必須執行operator<或者提供一個比較仿函數,並且你選擇哪一個必須實現嚴格的弱排序。這根本就沒有辦法。

+0

@uanchopanza感謝您的回答非常有幫助。當你說它不起作用,你的意思是編譯器會抱怨或行爲未定義? – MWright

+0

@MWright編譯器不會抱怨,並且一般情況下,當您不遵守標準中規定的規則時,您會調用未定義的行爲。 – juanchopanza