我有一个类(简化后)看起来像这样:
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标准的容器。
答案 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;
}