C の map では、反復中に要素を消去する動作を考慮することが重要です。この操作は正しく処理されないと、予期しない結果を招く可能性があります。
C 11 では、erase() メソッドが改善され、一貫性が保たれました。すべてのコンテナタイプにわたって。要素が消去されると、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; } }
C 03 では、反復中にマップを実行すると、反復子が無効になる可能性があります。この問題を回避するには、erase() 操作の外部でインクリメントされるループ変数を使用してマップを反復処理する必要があります。
次のコードは、C 03 で反復中にマップから要素を消去する正しい方法を示しています。 :
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. // Note the post increment. // Increments the iterator but returns the // original value for use by erase } else { ++pm_it; // Can use pre-increment in this case // To make sure you have the efficient version } }
以上がC で反復中にマップ要素を消去するとどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。