ホームページ > バックエンド開発 > C++ > C で反復中にマップ要素を消去するとどうなりますか?

C で反復中にマップ要素を消去するとどうなりますか?

Linda Hamilton
リリース: 2024-12-15 16:02:11
オリジナル
994 人が閲覧しました

What Happens When You Erase a Map Element During Iteration in C  ?

最初から最後まで反復中にマップ要素で Erase() を呼び出すとどうなりますか?

C の map では、反復中に要素を消去する動作を考慮することが重要です。この操作は正しく処理されないと、予期しない結果を招く可能性があります。

C 11

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート