如何迭代非线性容器

时间:2013-10-21 16:31:24

标签: c++ stl

考虑一个分层树结构,其中一个项目可能有兄弟项目(在层次结构中处于同一级别),也可能有子项目(层次结构中一级)。

让我们说结构可以定义为:

// 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_ifcount_ifany_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()迭代器。

  • 任何人都可以使用典型/惯用的方式来处理此类非线性数据结构吗?
  • 可以/应该为这样的结构创建迭代器吗?如何?

1 个答案:

答案 0 :(得分:1)

使用迭代器。

  

我想不出一种实现迭代器的方法,因为在遍历的递归版本中没有明显的end()迭代器。

end()可以是迭代器类的任何指定特殊值,只要递增运算符在跳过最后一个元素时生成它。和/或覆盖迭代器的运算符== / !=

如果您想要非常健壮,请为每个XPath axes实现迭代器模式。