2

Visitor の現在の位置をコンテナーに格納するための STL に似たイテレーターを使用して、C++ で Visitor パターンを実装しました。今、コンテナを繰り返しながら変更したいと思います。現在アクセスしているコンテナであっても、コンテナからアイテムを削除することに特に興味があります。

明らかに、これは訪問者の内部イテレータを無効にします。これはまさにこのアイテムを指していたからです。現在、すべてのイテレータのリストをコンテナに保存し、リストに何かが追加または削除されるとすぐにそれらを更新します。ある意味で、これはイテレーター (Observer として) とリスト (Observable として) に適用される Observer パターンに似ています。

別の方法として、現在のアイテムに何が起こったのか、どのように反復処理を進めるのかについて、visitor() メソッドが Visitor に何らかのヒントを返すようにすることを検討しましたが、それもあまり良い考えではないように思えます。次のアイテムを見つけることに本当に関心があります。

だから、私の質問は、アイテムがコンテナに追加されたり、コンテナから削除されたりしても、訪問者を動かし続ける最善の方法は何ですか.

よろしく、フロリアン

更新: コンテナーに対して 1 つのビジターが実行されていますが、visit() メソッド内では、同じコンテナーに対して任意の数の追加イテレーターを使用できます。コンテナ内のアイテムのいずれかが削除された visit() の呼び出しから戻った後でも、訪問者にコンテナ内の残りのアイテムを続行してもらいたいです。

4

3 に答える 3

0

トラバーサル中にコンテナを変更する場合、イテレータはせいぜい危険です。インデックスを使用して後方に歩くのが最も安全です。

于 2010-04-15T09:42:59.380 に答える
0

このような場合、コンテナーをコピーしてもコストがかからない場合は、コンテナーをコピーして、そのコピーを反復処理します。元のコンテナーは shared_ptr によってオブジェクトを保持しますが、コピーは weak_ptr を保持するだけです。

于 2010-04-16T17:06:38.480 に答える
0

イテレータと削除操作がそれほど多くない場合、(最初の) 実装はかなり良いと思います。この場合、Eddy が推奨するアルゴリズムのようなマーク アンド スイープを使用します。また、後者の方が簡単で、エラーが発生しにくいと思います。削除対象としてマークされたノードをスキップすることを忘れないでください。一方、イテレータを更新する必要がある「削除」以外のケースがある場合は、現在の実装に固執してください。

于 2010-04-15T11:52:47.773 に答える