私のプロジェクトの1つでは、オブジェクトのインメモリインデックスを作成したいという状況に遭遇しました。プライマリインデックスは異なるキーを使用し、セカンダリインデックスはいくつかの他の要素をキーとして使用します。 私はその後コンテナ間でオブジェクトを共有する最適な方法は何ですか?
std::map<string, Object>
(再びすべてのオブジェクトは一意で検討たとえばSTD ::マップ)別の容器を使用してセカンダリインデックスのための参照/ポインタを格納するための最良の方法ですとしてプライマリインデックスのためstd::map
を使用していた場合オブジェクトの追加コピーを作成することなく、
だろうが、ポインタ/主要指数のコンテナは、内部で自身を調整するとき、二次指数の参照は無効?)
std::map<string, const Object*>
- またはプライマリインデックスとのweak_ptrのセカンダリインデックス
std::map<string, std::shared_ptr<Object>> // primary index std::map<string, std::weak_ptr<Object>> // secondary index
でのshared_ptrの組み合わせを使用して
私は両方のアプローチについて長所と短所があることを知っています。特に、プライマリコンテナにオブジェクトを直接挿入する柔軟性を失いたくはありませんが、セカンダリインデックスでオブジェクトを再度コピーすることは望ましくありません。セカンダリインデックスのためだけにスマートポインタを使用することの難しさは、オブジェクトを所有しないことです。
ご協力いただきありがとうございます。
主キーを使用してオブジェクトを参照するのはどうですか? 'std :: map //セカンダリインデックス、値はプライマリキー'です。この点の欠点は、オブジェクトを取得するために別のマップルックアップが必要なことです。 :P –
Objectへの複数ステップの参照がありますか?コストはほぼ倍増するでしょう。 –
オブジェクトへのスマートポインタの使用をお勧めします。ポインタを 'std :: vector'に配置します。次に、インデックスを作成します。キーとオブジェクトへのスマートポインタを使用して、 'std :: map'を呼び出します。 –