0

(単純化すると) 次のようなクラスがあります。

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

    // ...
};

ツリー ノードにはポインタではなくオフセットが含まれている必要があります。これstd::vectorは、すべてのノードを再リンクするのに時間を費やすことなく、必要に応じてストレージを再割り当てできるコンテナ ( など) に埋め込むことができる必要があるためです。

ここで、適切に定義されたクラスTreeIterator<Iter>(おそらく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が格納されるコンテナのタイプを制限せずに、この問題を解決するにはどうすればよいですか?

ユーザーにstd::vector.

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 に答える