编写设计为内部(任意)容器的类(TreeNode)的遍历方法

时间:2013-08-26 08:43:34

标签: c++ stl iterator containers

我有一个类(简化后)看起来像这样:

class TreeNode
{
    ptrdiff_t sibling_offset, first_child_offset;
public:
    long whatever;

    // ...
};

树节点必须包含偏移而不是指针,因为它们可能需要嵌入容器(如std::vector)中,这些容器可能在必要时重新分配其存储,而不必花时间重新链接所有节点。

现在,如果我有一个适当定义的类TreeIterator<Iter>(可能被定义为friend TreeNode),那么它的工作就是迭代TreeNode个孩子,然后我的类的任何STL样式的客户端应该能够使用它以标准的STL方式迭代节点的子节点:

typedef std::vector<TreeNode> Tree;
Tree tree = ...;

TreeIterator<Tree::iterator> const root = tree.begin();
for (TreeIterator<Tree::iterator> i = root->begin(); i != root->end(); ++i)
{
    foo(i->whatever);
    process_further(i);
}

麻烦的是, root->begin()是不可能的,因为TreeNode中的容器一无所知。
(它不应该!它唯一关心的是容器有合适的迭代器。)

然而,TreeNode的作者)是唯一一个可能如何迭代其子女的人。

如何解决此问题,而不限制可能存储TreeNode的容器类型?

显然,如果我强迫用户使用std::vector,这很容易,但他应该可以自由使用任何符合STL标准的容器。

1 个答案:

答案 0 :(得分:-2)

您只需在TreeNode中定义函数begin()和end()。然后在代码中使用它们。

    class TreeNode {
        ...
        std::vector<T>::iterator begin() {return vec.begin();}
        std::vector<T>::iterator end()   {return vec.end();}
        ...
    private:
        std::vector<T> vec;
    }