2012-11-18 55 views
3

在一個二叉搜索樹下面的代碼:C++「<」,不小於運算符?

template <class TKey> 
class bst<TKey>::node *bst<TKey>::insert(node *T, TKey &key) 
{ 
if (T == NULL) { 
    T = new node; 
    T->key = key; 
} else if (T->key == key) { 
    cout << "key " << key << " already in tree" << endl; 
} else { 

    int dir = T->key < key; 
    T->link[dir] = insert(T->link[dir], key); 

} 

return T; 
} 

我很困惑什麼線

int dir = T->key < key; 

在做什麼。我可以理解「int dir = T-> key」,儘管這當然沒有意義,但我還沒有見過以前用過的「<」運算符。任何線索?

+0

'<'是'小於':該行將一個布爾0或1賦給一個int,這大概是如果你打開警告會被標記? –

+0

所有有條件的運算符都返回'0'或'1'。對於exmpl:'int a = 1 == 0;'將在'a'中賦值'0'。以同樣的方式'int a = a == a;'將在'a'中賦值'1'。它適用於所有條件運算符 – shashwat

回答

9

T->key < key是一個條件。它將評估爲truefalse。 如果它的計算結果爲true,則dir將獲得值1,否則將獲得值0

int dir = T->key < key; 

是短形式用於寫入

int dir; 
if(T->key < key) 
    dir = 1; 
else 
    dir = 0; 

boolean被分配到一個int,它得到對應於falsetrue01值。

0

<如果第一個操作數小於第二個操作數則返​​回1,否則返回0。

6

如果操作員沒有超載,比它有通常的意義;它評估爲truefalse。這是一個bool類型,因此可以隱式轉換爲int

但是,如果TKey是一個類並重載它,或者存在全局重載,那麼除非我們看到代碼,否則我們不知道它的作用。

+0

+!用於提高重載的可能性,該重載可能具有非布爾返回類型。 –

0

<運算符是一個布爾比較運算符 - 即,如果條件爲false,則其計算結果爲0;如果條件爲真,則計算結果爲1。它通常用在條件中,但直接使用返回值是完全有效的。在這種情況下,如果T->key的值小於key的值,則dir將爲1,否則dir將爲0

0

好吧,由於二叉搜索樹存儲的值小於左側的根,右側的值更大,因此您需要選擇要插入的方向。要做到這一點,你需要將密鑰與當前節點的值進行比較。這個比較的結果存儲在dir變量中。所以如果key小於T的值,dir將得到1,代表鏈接[]中的左側,該鏈接保存指向節點T的左側和右側分支的指針。然後插入用T的左側節點遞歸地完成。即爲什麼你在那裏做比較。只是爲了查看我們是否必須將元素插入到當前節點的右側或左側。