ホームページ > バックエンド開発 > C++ > 反復中に `std::set` から要素を安全に削除するにはどうすればよいですか?

反復中に `std::set` から要素を安全に削除するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-28 13:21:10
オリジナル
937 人が閲覧しました

How to Safely Delete Elements from a `std::set` While Iterating?

反復中に std::set から要素を削除

セットを反復処理する場合、以下に基づいて特定の要素を削除する必要があります。具体的な基準。要素を消去すると反復子が無効になると考えるのは論理的であるように思えるかもしれませんが、この動作は実装に依存します。

標準 23.1.2.8 では、「挿入メンバーは反復子および要素への参照の有効性に影響を与えてはならない」と規定されています。コンテナであり、消去メンバーはイテレータと消去された要素への参照のみを無効にします。」これに基づいて、反復中に要素を削除すると常に反復子が無効になるとは想定できません。

1 つのアプローチは、要素を削除した後に後置インクリメント演算子を使用することです。これにより、古い位置が消去関数に渡され、同時に反復子が新しい位置を指すようになります:

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        numbers.erase(it++);
    }
    else {
        ++it;
    }
}
ログイン後にコピー

別の方法では、現在の反復子をコピーし、後でそれをインクリメントします:

while (it != numbers.end()) {
    // Copy the current iterator and increment it
    std::set<int>::iterator current = it++;
    int n = *current;
    if (n % 2 == 0) {
        // Don't invalidate iterator it, as it points to the next element
        numbers.erase(current);
    }
}
ログイン後にコピー

C 11 では、最後に削除された要素に続く要素に反復子を返す Erase 関数を使用して、このプロセスを簡素化しています:

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        it = numbers.erase(it);
    }
    else {
        ++it;
    }
}
ログイン後にコピー

以上が反復中に `std::set` から要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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