2012-06-03 42 views
0

這是一個面試問題。爲了在C++代碼中使用std :: set,需要重寫哪個運算符?

參考示例代碼,需要其中的運營商之一,以重寫使用std::set<Value>

#include<iostream> 

class Value 
{ 
     std::string s_val; 
     int   i_val; 
    public: 
     Value(std::string s, int i): s_val(s) , i_val(i){} 
}; 

// EOF 

/* 
a  operator != 
b  operator > 
c  operator <= 
d  operator >= 
e  operator < 
*/ 

其實,我不明白爲什麼運營商需要在這裏被覆蓋。 「set」不允許重複的元素,可能operator!=需要被覆蓋?

+1

覆蓋'operator!='(或'operator ==')將難以維護複雜性保證,您不覺得嗎?仍然我發現這個問題有點難過... – 6502

+0

-1,因爲你似乎沒有試圖找出什麼是一個std ::設置和做什麼。 – Walter

+0

[std :: set用戶定義類型,如何確保沒有重複]的可能重複(http://stackoverflow.com/questions/1114856/stdset-with-user-defined-type-how-to-ensure-no -duplicates) –

回答

5

你不覆蓋任何操作,該std::set類模板允許你提供一個比較函數作爲模板參數。但是如果你要提供一個運營商,那麼需要的是bool operator<()。該操作員必須執行strict weak ordering。請參閱std::set文檔。

使用嚴格弱排序的原因是因爲set是有序容器,通常實現爲自平衡二叉樹。所以僅僅知道兩個元素是否相同是不夠的。該套件必須能夠訂購它們。而小於運算符或比較函數也用於測試元素相等性。

+0

我很困惑你的「你不必覆蓋任何運營商」。 *如果要使用* std :: set ',則默認使用'std :: less '。這不需要'operator <'? – Walter

+0

@Walter您可以將您自己的比較器作爲第二個模板參數進行設置,然後替換默認值'std :: less '。這是非常方便的,因爲如果你想讓包含沒有'operator <'的類型的對象的集合,而你無法控制它。 – juanchopanza

+0

+1好吧,我誤解了你的答案。當然,**如果你提供第二個模板參數,那麼你不需要提供'operator <'。是的,這可能非常方便,特別是因爲您可能不想提供該運營商,因爲它可能會混淆其他代碼,或者(如您所說),如果已經有一個「運營商<」,其含義超出您的預期排序。 – Walter

0

爲了加速執行沒有重複的元素,並通常檢查元素是否在其通常的某種樹中,只需要運算符<。 (少量的唯一用法由標準強制實施,其餘僅爲平均實施)

2

您需要爲您的類型實施operator<。必須遵循strick弱排序才能夠使用標準庫中的關聯容器,如std::setstd::map

閱讀有關:

這裏有一個例子:

0

一組保持了副本,而不需要operator=operator!=通過使用等價的概念。如果兩個項目都不小於另一個,則兩個項目是等價的:

if (!(a < b || b < a)) 
    // equivalent! 
相關問題