ホームページ >バックエンド開発 >C++ >反復中に C マップから要素を安全に削除するにはどうすればよいですか?

反復中に C マップから要素を安全に削除するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-09 13:52:14314ブラウズ

How Can I Safely Remove Elements from a C   Map During Iteration?

反復中にマップから要素を削除する

C では、erase を使用するため、要素を削除しながら標準ライブラリ マップを反復処理するのは困難な場合があります。 () は反復子を無効にします。ただし、この問題に対処するために広く受け入れられている慣用句があります:

for(auto it = m.begin(); it != m.cend() /* not hoisted */; /* no increment */)
{
  if(must_delete)
  {
    auto next = it;
    it = m.erase(it);      // or "it = m.erase(it)" since C++11
  }
  else
  {
    ++it;
  }
}

この慣用句の仕組みは次のとおりです:

  • ホイスティングなし: We do not hoistループ条件外のインクリメント演算子。これは重要です。要素が削除されてもホイストすると反復子が進み、未定義の動作が発生する可能性があります。
  • 安全なインクリメント: ループ内では、インクリメント演算子のみが適用されます。要素を削除すべきかどうかを確認した後。
  • 次の反復子をキャッシュする (C 11 またはLater): 要素が削除されると、消去する前に反復子を次の要素にキャッシュします。これにより、イテレータのシーケンスを中断することなく、シームレスに反復処理を続けることができます。

C 11 より前の構文:

C 11 より前では、const イテレータを消去するにはわずかな処理が必要でした。違う構文:

for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }

定数性と削除:

マップからの要素の削除は、ポインターの削除と同様に、要素の定数性に違反しません。絶え間ない。定数性は主に、値の有効期間ではなく、値を変更する能力を制限します。

以上が反復中に C マップから要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。