2017-04-27 9 views
0

複雑な構造(チェーンを持つハッシュテーブルなど)があり、その構造のカスタムイテレータを作成したい場合は、複雑な構造の内容を単純な構造にコピーすることは有効ですか?リスト)を作成し、暗黙のイテレータを単純な構造体に戻しますか? 余分なメモリが必要だとわかりましたが、私自身のイテレーターをゼロから作成するのではなく、それだけではいけない理由がありますか?構造体をリストにコピーし、リストのイテレータを返すことでイテレータを作成できますか?

+1

コピーを作成するために元のコレクションの要素を反復処理する必要はありませんか?また、イテレータを使用して要素を編集したい場合は、コピー方法は動作しません(コピーを編集します)。 – ROX

+0

@ROX各ループにネストされたオブジェクトをコピーしてコピーしますが、hasNext()関数を手動で実装することはできませんまたは類似。編集は利用できない、それは本当です。 – MousE0910

答えて

1

最終的には、イテレータを使用して元のコレクションの要素を編集する必要がない場合は、これを行うことができます。

メモリの問題を特定します。あなたがこれをしてはならない他の理由がありますか?リストを作成するのにかかる時間があります。反復するたびにこのリストのコピーを作成するか、元のコレクションを変更できる場合はリストを最新の状態に保つ必要があります。

イテレータを使用していくつかのルールに合致する最初の要素を見つけたい場合、そのコストは特に不幸です。最初の要素がルールに適合していても要素数が多い場合は、最終的に最初の要素までしか反復しないために多くのコピーを行います。

ただし、ネストされたループと同じジョブを実行する独自のイテレータを作成することはできます。あなたが反復しようとしている構造を知らないでまともなコード例を与えるのは難しいですが、一般的には、現在のサブコレクションが存在するまで、サブコレクション内の要素の反復子を保持するクラスを使用して実装します。完全に反復され、次に次のサブコレクションの開始に移動する。つまり、イテレータにはイテレータ、つまりイテレータが2つあります.1つは要素を返し、もう1つは(サブ)コレクションを返します。

+0

イテレータの中にイテレータを置くことができたことは決してありませんでした。それは私が思ったよりもはるかに簡単になります。複雑なカスタムイテレータクラスを作成せずにリストをコピーするだけでなく、シンプルでクリーンな方法が必要であることは分かっていました。ありがとう! – MousE0910

関連する問題