我有一个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的组合来存储和查找这些工具。
答案 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;