C++ 为设计在(任意)容器中的类(TreeNode)编写遍历方法

C++ 为设计在(任意)容器中的类(TreeNode)编写遍历方法,c++,stl,iterator,containers,C++,Stl,Iterator,Containers,我有一个类(简化后)如下所示: class TreeNode { ptrdiff_t sibling_offset, first_child_offset; public: long whatever; // ... }; 树节点必须包含偏移量而不是指针,因为需要将它们嵌入容器(如std::vector)中,容器可以在必要时重新分配其存储,而无需花费时间重新链接所有节点 现在,如果我有一个适当定义的类TreeIterator(可能定义为TreeNode的朋友),其工作

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

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

    // ...
};
树节点必须包含偏移量而不是指针,因为需要将它们嵌入容器(如
std::vector
)中,容器可以在必要时重新分配其存储,而无需花费时间重新链接所有节点

现在,如果我有一个适当定义的类
TreeIterator
(可能定义为
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);
}
typedef std::向量树;
树=。。。;
TreeIterator const root=tree.begin();
对于(树运算符i=root->begin();i!=root->end();++i)
{
foo(i->随便什么);
进一步处理(i);
}
问题是,
root->begin()
是不可能的,因为
TreeNode
对它所在的容器一无所知。
(它不应该这样做!它唯一关心的是容器是否有合适的迭代器。)

然而,我(TreeNode
的作者)是唯一一个可能知道如何迭代其子代的人

如何在不限制
TreeNode
可能存储的容器类型的情况下解决此问题?
显然,如果我强制用户使用
std::vector
,这很容易,但他应该可以自由使用任何与STL兼容的容器。

您只需在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;
    }
类树节点{
...
std::vector::iterator begin(){return vec.begin();}
std::vector::迭代器end(){return vec.end();}
...
私人:
std::vec;
}

您为什么需要一个容器?为什么不以老式的方式将树存储为根节点或指向它的指针?@KarthikT:主要是出于性能原因,也因为容器在某些情况下更容易管理树(例如,
std::copy
ing整个树更容易)。