(単純化すると) 次のようなクラスがあります。
class TreeNode
{
ptrdiff_t sibling_offset, first_child_offset;
public:
long whatever;
// ...
};
ツリー ノードにはポインタではなくオフセットが含まれている必要があります。これstd::vector
は、すべてのノードを再リンクするのに時間を費やすことなく、必要に応じてストレージを再割り当てできるコンテナ ( など) に埋め込むことができる必要があるためです。
ここで、適切に定義されたクラスTreeIterator<Iter>
(おそらくfriend
ofとして定義されている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
が格納されるコンテナのタイプを制限せずに、この問題を解決するにはどうすればよいですか?
ユーザーにstd::vector
.