1

データベーステーブルから取得したツールに関する情報を含むTool構造体があり、プログラムの起動時にすべてのツールが取得されます。

struct Tool {
    const int            id;
    const std::string    name;
    const std::string    category;
    int                  outcomeID;
}

そして、今のところ、これらのツールをベクターで維持するToolManagerクラスがあります。私が苦労しているのは、それらを取得して表示する必要がある方法に基づいて、これらを格納するのに最適なコンテナーです。

場合によっては、outcomeIDごとにテーブルグループ化ツールに表示する必要があります。多くの場合、それらはカテゴリごとにツリー構造で表示され、次のように1つまたは2つのoutcomeIDによってのみ表示されます。

CategoryName1
    Tool_1
    Tool_3
CategoryName2
    Tool_5

Boost :: multi_indexを使用したくありません(プロジェクトの性質上複雑すぎます)これらを保存および取得するための簡単で効率的な方法は何ですか?

編集:明確にするために、カテゴリまたはoutcomeIDの組み合わせによってこれらのツールを保存および検索できる必要があります。

4

1 に答える 1

1

1 つの解決策は、メイン ストレージとして永続的なイテレータ ( などlist) を持つコンテナを用意し、高速に取得するためにイテレータの補助コンテナを用意することです。

#include <list>
#include <set>

typedef std::list<Tool> container_type;
typedef container_type::iterator iterator_type;

struct outcome_cmp
{
    bool operator<(iterator_type const & a, iterator_type const & b) const
    {
        return a->outcomeID < b->outcomeID;
    }
};

container_type tools;
std::multi_set<iterator_type, outcome_cmp> outcome_index;

// insert "x":
auto it = tools.insert(tools.end(), x);
outcome_index.insert(it);

これで、通常のマルチセット反復パターンを使用して、結果 ID でグループ化されたツールを取得できます。

同様に、カテゴリと名前の順序を作成できます。

#include <tuple>  // for std::tie and free lexicographic ordering

struct cat_cmp
{
    bool operator<(iterator_type const & a, iterator_type const & b) const
    {
        return std::tie(a->category, a->name) < std::tie(b->category, b->name);
    }
};

std::multiset<iterator_type, cat_cmp> cat_index;
于 2012-11-01T23:54:06.690 に答える