9

私のメインコルーチンでは、ユーザーの操作に応じてテーブルからエントリを削除または追加しています。バックグラウンドで、テーブルのエントリを繰り返し処理したいと思います。ある反復で挿入を見逃しても、次の反復の前にそれをキャッチできれば、特に気にしません。

それを繰り返して安全pairsですか?または、next代わりに使用する必要がありますか?

4

2 に答える 2

6

テーブルのトラバース中にエントリを安全に削除できますが、新しいエントリ、つまり新しいキーを作成することはできません。ただし、既存のエントリの値を変更することはできます。(エントリの削除は、そのルールの特殊なケースです。)

于 2011-05-29T12:20:44.227 に答える
5

ここからは行けません。少なくとも直接ではない...

lhfが言ったように、テーブルのトラバース中にエントリを変更または削除することはできますが、追加することはできません。結果は...未定義です。(読む:すべての実用的な目的のためにハイパースペースまたは同等のものに分岐します。)

エントリを追加できるようにする場合は、テーブルのクローンを作成し、1つのコピーを反復に使用し、もう1つのコピーを挿入と削除の追跡に使用する必要があります。これ自体が要件に一致しない場合は、代わりに次のようなことを行う必要があります。

  1. テーブルを追加するために空のテーブルを作成します。
  2. メインテーブルの反復を開始します。
  3. 変更するエントリが見つかったら、その場で変更します。(これは許可されています。)
  4. 削除したいエントリが見つかったら、その場で削除します。(これは許可されています。)
  5. 追加したいエントリが見つかったら、空で始まった他のテーブルにそれらを追加します。
  6. 反復が終了したら、追加テーブルをメインテーブルにマージします。
  7. 泡。リンス。繰り返す。

採用できるルールがわずかに異なる他の同様のパターンがあります。たとえば、手順5と6の間に、マージなどの前に、追加されたテーブルエントリのテーブルウォーキングコードへの再帰呼び出しを挿入したい場合があります。メインテーブルと追加テーブルの両方で削除の可能性を追跡する必要がある場合もあります。それが可能な相互作用である場合。

于 2011-05-29T13:17:33.363 に答える