在我的一个项目中,我使用树实现,其中我使用容器 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