1

我有一个 Tool 结构,其中包含有关从数据库表中检索到的工具的信息,其中在程序启动时检索所有工具。

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

我有一个 ToolManager 类,它现在将这些工具保存在一个向量中。我正在苦苦挣扎的是,根据我需要如何检索和显示它们,哪种容器最适合存储它们。

有时它们需要按其结果ID 显示在表格分组工具中。很多时候,它们按类别显示在树结构中,并且只有一个或两个结果 ID,如下所示:

CategoryName1
    Tool_1
    Tool_3
CategoryName2
    Tool_5

我宁愿使用 Boost::multi_index (对于项目的性质来说太复杂了)。什么是存储和检索这些的简单、有效的方法?

编辑:要清楚,我需要能够通过类别或结果ID 的组合来存储和查找这些工具。

4

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 回答