2012-09-26 3 views
6

問題は簡単です: メンバーa、b、c、dを持つクラスがあります。 提供することで、クラス値を1つのメンバーの値ですばやく検索し、クラスリストを更新できるようにしたいaまたはbまたはcの現在値...
std::map<decltype(MyClass.a/*b,c,d*/),shared_ptr<MyClass>>の束について考えました。値がstd :: shared_ptrのマップを使用しているのは、クラスの複数の索引付きリストを持つための良い選択ですか?

1)それは良い考えですか?

2)この手作りのソリューションよりも優れたマルチインデックスがあらゆる点で優れていますか?

PS SQLはシンプルさ/機能上の理由から問題になりません。

+0

"*この手作りソリューションより優れたマルチインデックスがあらゆる点で優れていますか?*" MultiIndexはまだ移動セマンティクスをサポートしていません。 : - [ – ildjarn

答えて

7
  1. ブーストマルチインデックスは、コレクションの各変異後の日付までにすべてのインデックスを維持しようとする明確な欠点を有することができます。 多くの個別の書き込みを伴うデータロードフェーズがある場合、これは大きなパフォーマンス上のペナルティです。

  2. ブーストマルチインデックスの使用パターンは、プロジェクト(メンバー)のコーディングスタイル(および好み...)に適合しない場合があります。これはマイナーな欠点でなければなりませんが、私はそれを言及したildjarnとして

  3. を言及しようと思いました、MIは、そうでなければ、まだ

のよう移動セマンティクスをサポートしていません、私はマルチインデックスを後押し検討したいブーストあなたが受け取ったテストの量に達する可能性は低いので、ほとんどの場合、優れています。

+0

テストの量について....手作りのソリューションはテストが非常に少ないのでハード比較ですLOC – NoSenseEtAl

+0

良いことは、それは私の意見です:)その後、少なくともブーストLOCほとんどの社内チームが余裕があるよりも多くのペアでピアレビューされています。 – sehe

1

「本当の」オブジェクトを格納しているコンテナの1つを任意に1つのクラスにまとめて、マップしたタイプの生ポインタでstd::mapを使用するだけで、すべてのマップを1つのクラスにまとめることができます。最初の要素に戻るstd::map

ただし、これらのマップのコピーを作成する必要がある場合は、もう少し難しいでしょう。

+0

または、イテレータを要素の生ポインタの代わりに最初のマップに挿入します。 –

+0

私はsizeof shared_ptrをsizeofイテレータと比較して考えるのは間違っています.Iircマップは要素ごとに3つのポインタを持っているので、大きな問題ではありません。 – NoSenseEtAl

+0

@ChristianRau Iteratorsを最初のマップに入れておけば、 'map.find(key) - > second'ではなく' map.find(key) - > second-> second'のようなことをする必要があります。間接的に余分なレイヤーを追加しているため、メリットがありません。 –

関連する問題