0

我有一个类(简化时)如下所示:

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

    // ...
};

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

现在,如果我有一个适当定义的类TreeIterator<Iter>(可能定义为 a friendof TreeNode),其工作是迭代 aTreeNode的孩子,那么我的类的任何 STL 风格的客户端都应该能够使用它来迭代 a 的孩子标准 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可存储 a 的容器类型的情况下解决此问题?

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

4

1 回答 1

-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;
    }
于 2013-08-26T10:35:37.727 回答