选择正确的数据结构

时间:2012-11-01 23:38:30

标签: c++ sorting stl

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

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

我有一个ToolManager类,现在可以在矢量中维护这些工具。我正在努力解决的问题是容器最适合存储这些容器,这取决于我需要如何检索和显示它们。

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

CategoryName1
    Tool_1
    Tool_3
CategoryName2
    Tool_5

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

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

1 个答案:

答案 0 :(得分: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;