ホームページ >バックエンド開発 >C++ >反復中に C マップ要素で `erase()` を呼び出すのは安全ですか?

反復中に C マップ要素で `erase()` を呼び出すのは安全ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-11 15:21:14295ブラウズ

Is it Safe to Call `erase()` on a C   Map Element During Iteration?

最初から最後までの反復中に Map 要素で Erase() を呼び出した結果

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

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