C でマップを反復する場合、次の影響を考慮することが不可欠です。ループ内のマップ要素で Erase() メソッドを呼び出します。具体的には、要素を消去して繰り返しを続けても安全なのか、それとも別のコンテナにキーを収集して消去用に別のループを実行する必要があるのかという疑問が生じます。
C 03 では、要素をコンテナから消去します。 map は、削除された要素を指す反復子を除くすべて無効にしません。ただし、コードでは、erase を呼び出した後にイテレータを変更していることに注意することが重要です。これは、erase が呼び出されると pm_it が無効になるため、問題になります。これに対処するには、erase を呼び出す前にイテレータをインクリメントする必要があります。
map<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 iterator and post-increment } else { ++pm_it; // Can use pre-increment here for efficiency } }
C 11 では、erase が大幅に改善され、次のイテレータが返されるようになりました。これにより、上で示した面倒なポストインクリメント手法が不要になります。代わりに、次のように書くことができます:
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; } }
以上が反復中に C マップ要素で `erase()` を呼び出すのは安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。