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整个树更容易)。