2012-07-08 7 views
9

STL(g ++ 4.x.xに付属)は、地図などのコンテナを実装するために赤黒のツリーを使用することを理解します。 STL内部の赤黒の木を直接使用することは可能ですか?もしそうなら、どうですか?もしそうでないなら、なぜSTLは赤黒の木を暴露しないのですか?STLのRed-Blackツリーの内部実装の使用

驚いたことに、私はGoogleを使用して答えを見つけることができません。

編集:挿入時に余分なアロケータコンストラクタコールの解決策として赤黒のツリーを使用して調べています。 this questionを参照してください。私のSTLは、マップ実装に赤黒の木を使用しています。

+0

"私は挿入時に余分なアロケータコンストラクタコールの解決策として赤黒のツリーを使用して調査しています。"適切なソリューションは、このプロパティを持たない標準コンテナの実装を使用することです。 C++ 11はステートフルなアロケータを必要とします。したがって、このC++ 11の機能を適切にサポートする標準ライブラリは、より合理的な動作をします(ただし、異なるアロケータインスタンスを構築しますが、元のアロケータオブジェクトからのみ行います)。 –

+0

@Prasoon - それは、とにかくコンストラクタの呼び出しを行う基本的なツリーの実装であるため、ここでは役に立ちません。 gcc 4.1より新しいコンパイラを試してみることはオプションです(前の質問[STL mapのカスタムメモリアロケータ](http:// stackoverflow。com/questions/11373796/custom-memory-allocator-for-stl-map)) –

答えて

7

実際、答えは非常に簡単で、gccのバージョンには依存しません。 sgi's websiteからstlのソースコードをダウンロードし、実装と使用方法を自分で確認できます。

たとえば、バージョン3.2では、stl_tree.hファイルの赤黒のツリーの実装と、stl_set.hでの使用例を見ることができます。

stlクラスはテンプレートクラスなので、実装は実際にはヘッダファイル内にあることに注意してください。

2

setmapのほとんどのSTL実装は赤い黒色のツリーですが、別のデータ構造を使用して実装するのを止めるものはありません。私が正しく覚えていれば、C++標準ではRBツリーの実装は必要ありません。

STLは、OOPの原則に違反するように公開していません。他の誰かがあなたのライブラリを使用する場合、基礎となるデータ構造を公開すると、望ましくない動作につながる可能性があります。つまり、具体的にはsetmapについては、setmapのデータ構造に準拠するメソッドへのアクセスのみを許可する必要があります。潜在的な表現を公開すると、おそらくユーザーにsetという重複がある可能性があります。

言われているように、私の知る限り、潜在的な赤い黒の木を直接使用する方法はありません。それはあなたがそれをどのように使いたいかに大きく依存します。

3

使用されているデータ構造がになることを保証されていない場合でも、赤い黒のツリーを実装することが最も良い方法でしょうか? (例えばAVLツリーとして少なくとも1回は実装されており、B-、B *、B +ツリーのようなものもおそらくうまくいくでしょう)。

このように、内部で取得する唯一の方法は、特定の実装を見て、公に公開しない(少なくともしようとする)ものを利用することです。

理由:ほとんどの場合、抽象化の試みであり、すべての実装の詳細が公開されていないためです。