2011-09-12 12 views
2

C++ STL "set"および "map"は、挿入のための最悪の最悪ケース時間、 消去、および操作をサポートします。したがって、基本的な実装は バイナリ検索ツリーです。 setとmapの実装における重要な問題は、イテレータクラスをサポートする です。もちろん、内部では イテレータはイテレータの "現在の"ノードへのポインタを保持します。 ハードポイントは効率的に次のノードに進んでいます。 「設定」と「マップ」は、我々が++または返却何、我々はイテレータクラスすなわちを使用して次のノードに進めるか、バイナリ検索ツリーを実装している場合STL内のBST実装

私の質問は

  1. ある - すなわち、ありますそれは、サブツリーまたは右のサブツリーを残しましたか?

  2. 一般的に、STL実装のほとんどのBST、イテレータの++または - がどのように実装されていますか?

ありがとう!

答えて

6
  1. は、バイナリツリーの使用する必要がC++の仕様では何もありません。このため、++と - は要素のシーケンスの観点から定義されています。 mapおよびsetは、の注文番号の要素の順序を格納します。したがって、++は次の要素に移動し、 - は前の要素に移動します。次の要素と前の要素は、要素の順序で定義されます。

    C++仕様ではバイナリツリーを使用する必要はありませんが、特定のパフォーマンス要件によってバイナリツリーが使用されることがあります。

  2. 一般的には、Red/Black self-balancing binary treeのうちのいくつかを使用します。

1

ほとんどの場合、特定の実装に依存します。 一つの方法(私だけの説明:あなたが持っていない必ずしも1)は、次のことができます。

ノードが3つのポインターを持っている:は、を左とアップ。何++ない は次のとおりです。

  • 「権利」がある場合は、可能な限り最も深い左に行くよりも、右に行きます。
  • それ以外の場合は、右から来るまで上がってください。

何が--とまったく逆です。

+0

上記の説明に記載されている内容はインオーダーですか? – venkysmarty

+0

もちろん、私はbtreeが適切に整理されている(そしておそらくバランスが取れている)と、ポインタが適切に管理され、各挿入/削除時に配置されていると仮定しています。 –

0

最悪の場合の操作の複雑さの他に、マップ&のセット(およびC++標準ライブラリのすべてのオーダー/ソートされた関連コンテナ)は非常に重要な特性を持っています:それらの要素は常にキーによって順番にソートされます。
自己平衡バイナリ検索ツリーは操作上の複雑さを満たし、ソートされた順序で要素を与える唯一のトラバーサルは、あなたが推測した通り、in-orderです。
Nicol Bolasの答えは、通常の実装の詳細を示します。あなたが実際にこのような実装を見て欲しいのであれば、RDE STLの実装を見てください。 平均的なC++標準ライブラリの実装よりも読みやすくなります。参考のために、RDESTLの&マップ実装の両方のセットは、イテレータのみを持ちます(標準では双方向ではありませんが)。