在以下二进制搜索树的代码中:
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-&gt; key”,虽然当然没有意义,但我没有看到“&lt;”之前以这种方式使用的运算符。有线索吗?
答案 0 :(得分:9)
T->key < key
是一个条件。它将评估为true
或false
。
如果评估为true
,则dir
将获得值1
,否则将获得值0
。
int dir = T->key < key;
是写作的缩写
int dir;
if(T->key < key)
dir = 1;
else
dir = 0;
当boolean
分配给int
时,它会获得与0
或1
对应的值false
或true
。< / p>
答案 1 :(得分:6)
如果操作员没有超载,那么它具有通常的含义;它评估为true
或false
。这是bool
类型,因此可以隐式转换为int
。
但是,如果TKey
是一个类并且重载它,或者存在全局重载,那么除非我们看到代码,否则我们不知道它做了什么。
答案 2 :(得分:0)
<
返回1,否则返回0。
答案 3 :(得分:0)
<
运算符是一个布尔比较运算符 - 例如,如果条件为假,则计算结果为0
;如果条件为真,则计算结果为1
。它通常用在条件语句中,但直接使用返回值是完全有效的。在这种情况下,如果T->key
的值小于key
的值,则dir
将为1
,否则dir
将为0
答案 4 :(得分:0)
好吧,因为二元搜索树在左侧存储的值小于root,在右侧存储的值越大,您需要选择插入的方向。为此,您要将密钥与当前节点的值进行比较。此比较的结果存储在dir变量中。因此,如果key小于T的值,则dir得到1,表示链接[]中的左侧,它保存指向节点T的左右分支的指针。然后以T的左节点递归地完成插入。这是为什么你在那里进行比较。只是为了看看我们是否必须将元素插入当前节点的右侧或左侧。