我試圖實現一個二叉搜索樹,我需要一個函數告訴我一個元素是否已經存在於樹中! 但是我唯一可以使用的運營商是<。 這甚至可能嗎?查找兩個變量是否等於只有小於運算符
我已經嘗試過 和(a<b) || (b<a)
!(a<b) && !(b<a)
注:我只允許使用<比較我的元素二叉樹。
我試圖實現一個二叉搜索樹,我需要一個函數告訴我一個元素是否已經存在於樹中! 但是我唯一可以使用的運營商是<。 這甚至可能嗎?查找兩個變量是否等於只有小於運算符
我已經嘗試過 和(a<b) || (b<a)
!(a<b) && !(b<a)
注:我只允許使用<比較我的元素二叉樹。
您要找的表情爲:
!(a < b || b < a)
即相當於:
!(a < b) && !(b < a)
因爲Boolean algebra和logical operators。
完整的示例:
#include <iostream>
int main() {
int a = 2, b = 2;
if (!(a < b || b < a)) {
std::cout << "Are equal.";
}
else {
std::cout << "Are not equal.";
}
}
作爲一個例子,你可以爲ints
這樣做:
bool isEqual(int a, int b)
{
if((!(a < b)) && (!(b < a)))
return true;
return false
}
如果您無法使用甚至&&
運營商,你可以嵌套的if語句。還有更多()
s,這只是爲了讓評估順序更加明顯。
假設提供的'operator <'返回'bool'是安全的。在這種情況下,您可以使用'operator &&',因爲它已經很好地定義了'bool'。 –
無法保證,只給予operator<
的執行,即a == b
。
這是因爲存在一個所謂的「偏序」的概念,這可能,異常情況下,允許這樣一個場景,兩個物體可以有條件下令反目成仇。
作爲示例,考慮描述類繼承的圖。我們可以定義以下規則:
A
等於類B
如果A
和B
描述同一類。A
比B
類更大如果A
是B
一個超類或是B
或等類的超類的(從A
B
繼承,或B
繼承C
從A
繼承等)類的超類A
小於B
類如果A
是B
一個子類(從B
A
繼承,或從C
從B
繼承等A
繼承)A
不會相對於命令B
類,如果它們沒有相對於彼此(A
不從B
繼承,並B
不從A
繼承)A
類不相對於有序類B
如果他們都來自同一個超類繼承,但在其他方面沒有關係(從C
A
繼承,從C
B
繼承)A
沒有相對於責令B
類,如果他們相互來自同一個子類繼承,但在其他方面沒有關係(來自A
C
繼承和B
)這使得完全有理由認爲,鑑於以下功能:
std::string compare(T const& a, T const& b) {
if(a == b)
return "Equal to";
else if(a < b)
return "Less than";
else if(a <= b)
return "Less than or Equal to";
else if(a > b)
return "Greater than";
else if(a >= b)
return "Greater than or Equal to";
else
return "Unordered to";
}
輸出可以是"Unordered to"
,給定的某些輸入。
只有確保兩個泛型參數彼此相等的方法是對operator==
有一個超載。
現在,你的好消息是,如果你正在構建一個二叉搜索樹,有一個不成文的約定,用於比較的類型應該至少是弱有序的(這意味着a==b
將返回相同的!(a < b || b < a)
)。所以在你的具體情況下,只要提供的鍵值值是弱排序的,!(a < b || b < a)
將總是當對象相等時返回true。
但是您確實需要一些機制來確保用戶不會嘗試將部分排序的鍵傳遞給您的比較函數。否則,你堅持要求完整的operator==
實施。
P.S:之前有人跳進去說:「什麼事?關於算術類型」,我想提醒你,NaN
存在兼容IEEE浮點值,其中a < b
和b < a
既可以返回false。如果a
和b
都是NaN
,即使兩個NaN
值具有相同的有效負載,a == b
也可以返回false!此外,這種關係是只保證整數在一個二進制補碼錶示,其中C++標準不需要。
你只能做兩件事:'a David
[運算符<和嚴格弱排序]的可能重複(https://stackoverflow.com/questions/979759/operator-and-strict-weak-ordering) –
如果兩個值中的任何一個都小於另一個,則它們必須是等於。 –