C での反復中にマップ要素を安全に消去するにはどうすればよいですか?
反復中にマップ要素を消去する際の潜在的な落とし穴
C でマップを操作する場合、反復中に要素を消去した場合の影響を考慮することが重要です。彼ら。この質問では、潜在的な問題を調査し、C 03 と C 11 の両方の解決策を提供します。
C 03 の考慮事項
C 03 では、マップから要素を消去しても、マップ内のすべてのイテレータを自動的に無効にします。ただし、削除された要素を指す反復子は無効になります。マップを安全に反復処理し、反復中に要素を消去するには、erase を呼び出す前に反復子をインクリメントする必要があります。質問で提供されているコードの更新バージョンは次のとおりです。
map<string, SerialdMsg::SerialFunction_t><string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin(); while (pm_it != port_map.end()) { if (pm_it->second == delete_this_id) { port_map.erase(pm_it++); // Use post-increment to get the updated iterator. } else { ++pm_it; // Can use pre-increment for efficiency. } }
C 11 の機能強化
C 11 では、erase() メソッドが大幅に改善されました。マップ内の次の要素を指すイテレータを返すようになり、他のイテレータを無効にすることなく反復中に要素を安全に消去できるようになりました。 C 11 を使用して更新されたコードは次のようになります。
auto pm_it = port_map.begin(); while (pm_it != port_map.end()) { if (pm_it->second == delete_this_id) { pm_it = port_map.erase(pm_it); } else { ++pm_it; } }
Mark Ransom Technique
Mark Ransom Technique は、反復中にマップ要素を安全に消去するための C 03 の別のオプションです。 。これには、消去する要素のキーを保存する一時ベクトルを作成し、2 番目のループでそれらを消去することが含まれます。
結論として、 C での反復中にマップから要素を消去するときは、潜在的な要素を考慮に入れてください。イテレータの無効化を行い、使用している C バージョンに応じて適切なアプローチを使用してください。一貫性を維持し、予期しない動作を避けるために、要素を削除する前に必ず反復子をインクリメントしてください。
以上がC での反復中にマップ要素を安全に消去するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?
