2011-07-12 18 views
3

この質問は回答されているので、以下では私が達成したいことを説明します。データ構造のデザインパターン

ハッシュされる可能性のあるプライマリ列を介して、すべての行エントリに効率的にアクセスできるように設計された表形式のデータ構造を作成したかったのです。私はこれについて最善の方法は、それぞれが1つの列を表す二重リンクリストのベクトルと、ノードへのプライマリ列エントリハッシュのマッピングを含むマップを維持することだと考えました。さて、最初の間違いは、ノードへのポインタを格納できるようにするために、二重リンクリストの独自の実装を作成する必要があると考えていることです。実際には、標準でイテレータをstd :: list do挿入やスプライシングの結果として無効になることはありません(larsmansの答えを参照)。ここに私が以前にやりたかったことを説明するための擬似コードがあります。前に説明したように、入力タイプを表すtypename Tの存在と、dlistとノードクラスの存在を仮定します。

typedef dlist<T> column_type; 
typedef vector<T> row_type; 
typedef ptr_unordered_map<int32_t, row_type> hash_type; 

shared_ptr<ptr_vector<column_type> > columns; 
shared_ptr<hash_type> hashes; 

は今、larsmansの答えを読んだ後、私はそれがあるとしてBoost.MultiIndexが私のニーズのすべてを満たしているので、私は、このいずれかを必要としないことを学びました。私がしたとしても、Boost.Intrusiveは、私が記述したことを達成するためのより効率的なデータ構造を提供します。

質問に興味を持った人や助けをしたすべての人に感謝します。これ以上質問がある場合は、別のコメントを追加してください。質問を明確にするために最善を尽くします。そのbegin方法は通常の代わりに参照のイテレータを返す以外

+0

Operator []は、基本となる連続したメモリシーケンスである場合にのみオンにする必要があります。データ構造のようなリンクされたリストでそれを使用することは、IMOの良い考えではありません。これが、 'std :: list'、' operator [] 'が' std :: vector'のときにオーバーロードされない理由です。 – Mahesh

+5

@Mahesh - 'std :: map'が連続しているので? '' Operator [] 'は、データ構造体が格納されたデータの識別子をサポートする場合にのみ許可されなければなりません。' 'vector''と' 'map''は行いますが、' 'list''は含みません。 – littleadv

+0

@littleadv - 情報をありがとう。 – Mahesh

答えて

3

front()value_type

を含むノードへの参照を返す必要がありますが、STL /ブースト点では代わりにfrontbeginのあなたの思考、のようですね。

どのように私はstd::list::iteratorタイプにキーハッシュのマップを使用して、マップ内のエントリはちょうど行う

時代遅れ得ることなく、行の追加を可能にすることができるだろう。 " listは、挿入とスプライシングが要素をリストするイテレータを無効にすることはなく、削除さえ削除される要素を指すイテレータのみを無効にするという重要な特性を持っています。"( STL docs

テーブル全体に対して単一のstd::listを保持し、その中に反復子のvectorを保持して行の開始点を表すことができます。

さらに、Boost.IntrusiveBoost.MultiIndexを見ましたか? ハッシュのstd::map(赤黒の木)がハッシュテーブルを表現するのに非常に最適ではない方法であることはご存知ですか?

+0

ああ、お見積もりありがとうございます。イテレータの位置がstd :: listのためにそのまま保持されることはわかりませんでした。はい、私はstd :: mapを使用することが最適ではないことを知っていますが、擬似コードは説明のための基本的なスケッチとされていました。私が(悪い)設計に行くならboost :: unordered_mapを使っていただろう。 Boost.Intrusive and Boost.MultiIndex;を見てください。ありがとう! –

+1

Boost :: IntrusiveとBoost :: MultiIndexは非常に便利です。私は両方のドキュメントを読んでいて、将来それらを使用します。助けてくれてありがとう! –