セットを反復処理する場合、以下に基づいて特定の要素を削除する必要があります。具体的な基準。要素を消去すると反復子が無効になると考えるのは論理的であるように思えるかもしれませんが、この動作は実装に依存します。
標準 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 サイトの他の関連記事を参照してください。