2012-11-01 121 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 '。 –