在我的一個項目中,我使用樹實現,其中我使用容器 C=std::map<K,V>
來維護每個樹節點的子項列表。每個樹節點都有一個唯一的名稱密鑰K
,通常爲std::string
。容器模板參數std :: map或std :: vector
template<typename V, template<typename Key=std::string,typename Type=TreeNode<V>,typename ...> typename C>
class TreeNode {
typedef C<std::string, Value> cont_type;
typedef V data_type;
cont_type childs;
data_type value;
cont_type::iterator genericFind(const K& k) {
// Something generic here!!!
}
}
這個實現對我來說工作得非常好,除了std :: map沒有考慮樹中插入的順序。對於某些應用程序,我需要保持插入的順序,但對於其他應用程序來說,快速信息反轉的需求更重要。
因此C
必須要麼
std::vector<std::pair<K, V>> // keeping insertion order
或
std::map<K,V> // fast information retrivial
不,我有我的TreeNode
類的實現問題,依然採用明確的std::map
接口類型。尤其是,它使用的成員函數find
,erase
,insert
需要被泛型替換,其中兩種容器類型的實現都非常具體。
例如childs.find(key)
需要替換find(childs.begin(), childs.end(), key)
,只要我插入std::vector
實現。
也許有另一種解決方案,我不知道。這可能是boost::multi_index
,但我對此很不確定。
什麼可能是解決我的問題最簡單的方法?
由於預取,向量可以非常快。不要把他們視爲「緩慢」。我建議(只是爲了科學)你也做矢量實現並測量你得到的性能差異。 – Hayt
像這樣的東西可能會有所幫助:http://codereview.stackexchange.com/a/59999/42409 – Deduplicator
由於一個是序列容器,另一個是關聯容器,希望找到任何接近對稱的東西都是非常希望的。無論如何,如果快速檢索真的出現在菜單上,請勿爲您的關聯容器折扣'unordered_map'。值得衡量。如果不是因爲你的「擦除」要求,我會建議只保留一個向量值*和*一個映射(你選擇的一種)映射向量索引的鍵,但是'擦除'會在游泳池。 – WhozCraig