2

私は独自のSTLのようなコンテナを作成しています - 任意の数の子を持つツリー

template<typename Type>
class Node
{
    Type value;
    Iterator AddChild(const Type & value);
    void Remove(const Iterator & where);
    ...
};

イテレータは現在のノードoperator*を返す必要があると判断しましvalueたが、何を返す必要がありoperator->ますか? 現在、それは戻ってきNode<Type>*ており、そのような状況で非常に役立ち ます

Node<int>::Iterator it = tree.begin();
it->AddChild(4);

しかし、私のメンターは私に、それoperator->は戻ってくるべきだと言いましたType*。ノードのメソッドにアクセスするSTLのような方法は何ですか? みたいなのit.Ref().MyMethod()が見栄えが悪い。

4

3 に答える 3

4

あなたの指導者は正しいです。 の戻り値の型は であるoperator->()必要がありますType*

イテレータの背後にある大きなアイデアは、イテレータがコンテナ内のいくつかの場所への単なるスマート ポインタであるということです。その場所に格納されている値を ( に代入して*it) 変更したり、そのメンバーにアクセスしたりできますが、コンテナーの内容をより大幅に (つまり構造的に) 変更するには、コンテナー自体に直接アクセスする必要があります。

そのため、STL にはノードのメソッドがありません。代わりに、イテレータを引数として受け入れるコンテナのメソッド (およびアルゴリズム) があります。

言い換えれば、あなたがやろうとしていることを行うSTLの方法は次のとおりです。

Node<int>::Iterator it = tree.begin();
tree.AddChild(it, 4);
于 2013-03-29T09:44:56.543 に答える
1

operator->戻る必要があり、戻る必要がYourTree::value_type*あります。(実際にはandですが、これらは通常、値型のandの単なるエイリアスです)。一貫性に注意してください。これがないと、標準アルゴリズムは機能しません。operator*YourTree::value_type&YourTree::pointerYourTree::reference*&

value_type を決めるのはあなた次第です。あなたが望むなら、それはうまくいくかもNodeしれません。ただし、これは混乱を招き、一貫して実装するのが難しい場合があります。そのままにしておきますType

于 2013-03-29T09:42:07.127 に答える
0

プログラマーはit->methodと同等であると想定する(*it).methodため、は参照を返すoperator->ものと同じものへのポインターを返す必要がありoperator*ます。通常、それは反復子の値であるべきです。これは、値を取得するための予想される方法だからです。

ノードのメソッドをポインタのメソッドとして公開できます。つまり、 as と呼ばれますit.methodが、やや混乱し、ほとんどの場合、イテレータを引数として取るコンテナのメソッドと比較して、イテレータに余分なデータが必要になります。そのため、STL は常にイテレータを取るコンテナーのメソッドを使用します。たとえば、 の後にcontainer.insert(iterator, value)挿入します。valueiterator

于 2013-03-29T10:02:44.497 に答える