3


0

複数のキータイプの連想配列は可能ですか?
私はコンテナに格納する必要のある大量のオブジェクト(潜在的に1000個)を取得しました。 ID番号(64ビットunsigned int)または名前(std

string)の2つの方法で特定のインスタンスを見つけることができる必要があります。 一般的にはIDが最も一般的ですが、場合によっては名前はわかっているがIDはわかっていません。

std

mapは単一の<→値を提供できますが、ここでは、2つのセットのstd :: mapコンテナー(Ids用と文字列用)が最善の方法であるかどうかはわかりません。

編集-コードとエラーの修正:

[OK]を、私はとにかくブーストを持っているので、マルチインデックスを試してみようと思ったが、私はそれを伝えることができる限りドキュメントでそれを正確に行ったにもかかわらず、それをコンパイルすることはできないようだ:(

テストコード:

namespace common
{
    class MyBaseClass
    {
    public:
        typedef boost::uint64_t Id;

        //name and id are constant, at least for the period im intrested in
        //when I want it in the container...
        const std::string &getName()const{return name;}
        Id getId()const{return id;}

        ...other stuff...
    };
}

class MyClass : public common::MyBaseClass
{
    ...other stuff...
};

typedef boost::multi_index_container
<
    MyClass*,
    boost::indexed_by
    <
        boost::ordered_unique >,
        boost::ordered_unique >
    >
>MyClassList;

あなたの平均ブーストテンプレートエラー…​

_ c:\ lib \ c \ boost \ boost \ aligned_storage.hpp(69):エラーC2872: 'detail':あいまいな記号+ 'boost :: detail'または 'boost :: multi_index :: detail' + c: \ lib \ c \ boost \ boost \ multi_index \ detail \ index_node_base.hpp(42):コンパイル中のクラステンプレートのインスタンス化 'boost :: aligned_storage’への参照を参照+ + + [+ size = 4、+ alignment_ = 4 ] + c:\ lib \ c \ boost \ boost \ multi_index \ detail \ index_node_base.hpp(47):クラステンプレートのインスタンス化 'boost :: multi_index :: detail :: pod_value_holder'への参照を参照+コンパイル+ + [+ Value = MyClass * +] + c:\ lib \ c \ boost \ boost \ multi_index \ detail \ ord_index_node.hpp(582):クラステンプレートのインスタンス化 'boost :: multi_index :: detail :: index_node_base'への参照を参照 でコンパイル Value = MyClass *、+ Allocator = std :: allocator ] + c:\ lib \ c \ boost \ boost \ multi_index \ ordered_index.hpp(137):クラステンプレートのインスタンス化 'boost :: multi_index :: detailへの参照を参照:: ordered_index_node 'コンパイル中+ + [+ Super = boost :: multi _index :: detail :: index_node_base> +] + c:\ lib \ c \ boost \ boost \ multi_index \ ordered_index.hpp(119):クラステンプレートのインスタンス化「boost :: multi_index :: detail :: ordered_index」への参照を参照コンパイル済み + [+ KeyFromValue = boost :: multi_index :: const_mem_fun、+ Compare = std :: less、std :: allocator >>、+ SuperMeta = boost :: multi_index :: detail :: nth_layer <2、MyClass *、 boost :: multi_index :: indexed_by>、boost :: multi_index :: ordered_unique >>、std :: allocator>、+ TagList = boost :: mpl :: vector0、+ Category = boost :: multi_index :: detail :: ordered_unique_tag + ] + c:\ lib \ c \ boost \ boost \ multi_index_container.hpp(86):コンパイル中のクラステンプレートのインスタンス化 'boost :: multi_index :: detail :: ordered_index'への参照+ + [+ KeyFromValue = boost :: multi_index :: const_mem_fun、+ Compare = std :: less、+ SuperMeta = boost :: multi_index :: detail :: nth_layer <1、MyClass *、boost :: multi_index :: indexed_by>、boost :: multi_index :: ordered_unique >> 、std :: allocator>、+ TagList = boost :: mpl :: vector0、+ Category = boost :: multi_index :: de tail :: ordered_unique_tag +] + c:\ projects \ bad_angle_studios \ brak3 \ trunk \ source \ source \ server \ MyClass.cpp(18) : see reference to class template instantiation 'boost :: multi_index :: multi_index_container' + + [+ Value = MyClass *、+ IndexSpecifierList = boost :: multi_index :: indexed_by>、boost :: multi_index :: ordered_unique >> +] + c:\ lib \ c \ boost \ boost \ aligned_storage.hpp(53):エラーC2872: 'detail':あいまいな記号+ 'boost :: detail’または 'boost :: multi_index :: detail' + c:\ lib \ c \ boost \ boost \ aligned_storage.hpp(56):クラステンプレートのインスタンス化への参照を参照 'boost :: detail :: aligned_storage :: aligned_storage_imp :: data_t'コンパイル中+ + [+ size_ = 4、+ alignment_ = 4 +] + c:\ lib \ c \ boost \ boost \ aligned_storage.hpp(69):コンパイル中のクラステンプレートのインスタンス化 'boost :: detail :: aligned_storage :: aligned_storage_imp’への参照を参照+ + [+ size_ = 4、+ alignment_ = 4 ] + c:\ lib \ c + \ boost \ boost \ aligned_storage.hpp(73):エラーC2872: 'detail':曖昧なシンボル+ 'boost :: detail' または 'boost :: multi_index :: detail ' c:\ projects \ bad_angle_studios \ brak3 \ trunk \ source \ source \ server \ MyClass.cpp(44) : error C2676: binary '[' : 'MyClassList' does not define this operator または、事前定義された演算子に受け入れられる型への変換 __

5 Answer


5


boost

multi_indexはあなたの問題の答えです。 使用方法の詳細については、http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/tutorial/basics.html#multiple_sort [there]を参照してください。


1


上記に代わるもう1つの選択肢があります。どのソリューションを選択するかは、ニーズによって異なります。 SqlLiteを取得して、オブジェクトに関するデータをデータベースに保存し、それらのクエリを実行します。


1


Fire Lancer、Boost.MultiIndexの名前を正しく修飾していません。たとえば、「boost

indexed_by」などのように「boost :: multi_index :: indexed_by」を記述する必要があります。


0


2つのマップのアプローチ(1つはキーとしてIDを使用し、もう1つはキーとして名前を使用する)は、私には良いようです。 実装は簡単で、うまく機能します。

他の回答がBoostライブラリを推奨していることがわかりました。 すでにプロジェクトでブーストを使用している場合、それは良い解決策かもしれません。 そうしない場合-この単純なケースのためだけに、プロジェクトにブーストを追加する価値があるかどうかはわかりません。


-1


データをstd

vectorに保存し、std :: findアルゴリズムを使用してアイテムを検索できます。 検索アルゴリズムはさまざまなコンパレータを受け入れるため、IDに一致するものと名前に一致するものを定義するだけです。

検索アルゴリズムはstd

mapおよびstd :: setのfindメソッドよりも遅いため、パフォーマンスが大きな懸念事項である場合は、速度を犠牲にして2つのマップを使用するか、ブーストを使用することをお勧めします

編集 IDをキーとして使用して、データをマップに保存します。これは一般的なケースです。 次に、std

findアルゴリズムと、珍しいケースの名前で一致する述語を使用します。 これにより、パフォーマンスの問題が軽減されます(ただし、削除されません)。