0

無効なPOSITIONなどに対処するための特別なケースコードをあまり使わずに、次のことをしようとしています:

空白を埋める最良の方法は何ですか?

void DeleteUnreferencedRecords(CAtlMap<Record>& records)
{
   for(____;____;____)
   {
      if( NotReferencedElsewhere(record) )
      {
        // Delete record
        _______;
      }
   }
}
4

3 に答える 3

2

これによれば:

http://msdn.microsoft.com/en-us/library/0h4c3zkw(VS.80).aspx

RemoveAtPosにはこれらのセマンティクスがあります

指定された位置に格納されているキーと値のペアを削除します。要素の保存に使用されていたメモリが解放されます。posによって参照されるPOSITIONは無効になり、マップ内の他の要素のPOSITIONは有効なままですが、必ずしも同じ順序を保持するわけではありません。

問題は、順序が変更される可能性があることです。つまり、GetNext()は実際には反復を続行しません。あるパスで削除したいPOSITIONを集めて、次のパスで削除する必要があるようです。POSITIONを削除しても、他のPOSITIONオブジェクトは無効になりません。

于 2008-10-13T18:31:21.483 に答える
0

私の最初の考えは、呼び出す前に現在のPOSITIONを保存するGetNextことです。次に、要素を削除すると、それをリセットできます。ただし、おそらく最も安全な方法は、保持したい要素を含む新しいマップを作成することです。そうでない場合は、POSITIONの内部実装がどのように機能するかに依存する可能性があります。

于 2008-10-13T10:35:04.597 に答える
0

私はあまり詳しくありませんが、STL の型にCAtlMap似ている場合、 Rob の「最初の考え」は安全です。アイテムを削除しても、削除されるアイテムを指しているイテレータ以外のイテレータには影響しません。map

于 2008-10-13T15:47:33.827 に答える