3

二分探索木の次のコードでは、次のようになります。

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」は理解できましたが、もちろん意味がありませんが、「<」演算子がそのように使用されているのを見たことがありません。手がかりはありますか?

4

5 に答える 5

9

T->key < keyが条件です。trueまたは のいずれかに評価されますfalse。と評価された場合は value を取得しtrue、それ以外の場合は value を取得します。dir10

int dir = T->key < key;

書き込みの省略形です

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

booleanに代入されると、またはに対応するint0またはが取得されます。1falsetrue

于 2012-11-18T05:18:52.590 に答える
6

演算子がオーバーロードされていない場合は、通常の意味を持ちます。trueまたは のいずれかに評価されますfalse。これはbool型であるため、暗黙的に に変換できますint

ただし、TKeyがクラスであり、それをオーバーロードしている場合、またはグローバル オーバーロードがある場合は、コードを見ない限り、それが何をするかわかりません。

于 2012-11-18T05:19:40.710 に答える
0

<第 1 オペランドが第 2 オペランドより小さい場合は 1 を返し、それ以外の場合は 0 を返します。

于 2012-11-18T05:19:04.283 に答える
0

<演算子はブール比較演算子です。つまり、条件が false であるかどうか、および条件が true であるかどうかを評価し0ます1。通常は条件で使用されますが、戻り値を直接使用することは完全に有効です。この場合、 の値がT->keyの値より小さい場合はkey、そうでない場合は にdirなります。1dir0

于 2012-11-18T05:19:44.587 に答える
0

二分探索木はルートより小さい値を左側に格納し、大きい値を右側に格納するため、挿入が行われる方向を選択する必要があります。これを行うには、キーを現在のノードの値と比較します。この比較の結果は、dir 変数に格納されます。したがって、key が T の値よりも小さい場合、dir は、ノード T の左右の分岐へのポインターを保持する link[] の左側を表す 1 を取得します。そして、挿入は T の左側のノードで再帰的に行われます。つまり、なぜそこで比較するのか。現在のノードの右または左に要素を挿入する必要があるかどうかを確認するだけです。

于 2012-11-18T05:22:42.753 に答える