考虑一个分层树结构,其中一个项目可能有兄弟项目(在层次结构中处于同一级别),也可能有子项目(层次结构中一级)。
让我们说结构可以定义为:
// an item of a hierarchical data structure
struct Item {
int data; // keep it an int, rather than <T>, for simplicity
vector<Item> children;
};
我希望能够在这个结构上使用算法,比如std :: map,std :: vector等的算法。所以,我创建了一些算法,比如:
template <class Function>
Function for_each_children_of_item( Item, Function f ); // deep (recursive) traversal
template <class Function>
Function for_each_direct_children_of_item( Item, Function f ); // shallow (1st level) traversal
template <class Function>
Function for_each_parent_of_item( Item, Function f ); // going up to the root item
困扰我的一件事是同一个结构有3个for_each()
函数。但是他们很好地描述了他们如何迭代,所以我决定忍受它。
然后,很快就出现了对更多算法的需求(例如find_if
,count_if
,any_of
等),这让我觉得我没有走上正确的道路,设计-wise。
我能想到的一个可以减少工作量的解决方案就是简单地写:
vector<Item> get_all_children_of_item( Item ); // recursive
vector<Item> get_all_direct_children_of_item( Item ); // 1st level items
vector<Item> get_all_parents_of_item( Item ); // up to the root item
然后我可以使用所有STL算法。 我对这个解决方案有点警惕,因为它涉及复制。
我想不出实现iterator
的方法,因为在遍历的递归版本中没有明显的end()
迭代器。
答案 0 :(得分:1)
使用迭代器。
我想不出一种实现迭代器的方法,因为在遍历的递归版本中没有明显的end()迭代器。
end()
可以是迭代器类的任何指定特殊值,只要递增运算符在跳过最后一个元素时生成它。和/或覆盖迭代器的运算符==
/ !=
。
如果您想要非常健壮,请为每个XPath axes实现迭代器模式。