2012-11-01 86 views
1

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

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

而且我有一个向量中维护这些工具现在ToolManager类。我正在努力的是什么容器是最好的存储这些基于我需要检索和显示它们。

有时他们需要通过其结果ID在表格分组工具中显示。很多时候,他们是像这样显示在一个树状结构按类别和只有一个或两个outcomeID的:

CategoryName1 
    Tool_1 
    Tool_3 
CategoryName2 
    Tool_5 

我宁愿使用boost :: multi_index(该项目的性质太复杂)。 什么是简单而有效的方式来存储和检索这些?

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

+1

是否确定维持手动单独的数据结构的附加索引? –

+0

@KerrekSB是的,没关系。只是不知道我该怎么做。 – rem45acp

+0

我想这必须是家庭作业,因为为什么你会从数据库中提取数据,然后重新实现数据库的功能来查看数据?例如'select * from tools where category ==“something”or outcomeID == someid' – Skizz

回答

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; 
+0

如果我需要获得具有特定类别和结果的所有工具,该怎么办? – rem45acp

+0

因此,对于类别,名称和结果,它将简单地为'std :: tie(a-> category,a-> outcomeID,a-> name)'。尼斯。 – rem45acp

+0

@ rem45acp:如果您需要实际的* lookup *而不是仅仅排序,那么也可以使用'std :: multimap '。 –