マップからの反復削除: イテレータの保持
マップの反復では、要素の削除はイテレータを無効にする可能性があるため、難しい操作になることがあります。これを防ぐために、プログラマはイテレータの有効性を維持する解決策を求めることがよくあります。
この問題の標準的な解決策は、連想コンテナ消去イディオムです。
for (auto it = m.cbegin(); it != m.cend() /* not hoisted */; /* no increment */) { if (must_delete) { m.erase(it++); // or "it = m.erase(it)" since C++11 } else { ++it; } }
重要なことに、通常の for ループは次のようにする必要があります。コンテナーが変更されているため、ここでは範囲ベースの for ループ (RBFL) ではなく使用されます。通常の for ループでは、反復子は明示的にインクリメントされ、反復プロセスを制御します。要素を自動的に反復する RBFL は、反復メカニズムを隠し、未定義の動作を引き起こす可能性があります。
C 11 より前の実装では、構文が若干異なります。
for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }
ここでは、constイテレータは消去できません。したがって、消去に対応した専用のイテレータを使用する必要があります。
以上がイテレータの有効性を維持しながら C マップから要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。