2012-11-18 38 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的左侧节点递归地完成。即为什么你在那里做比较。只是为了查看我们是否必须将元素插入到当前节点的右侧或左侧。