2026-08-20
remove_negatives.cpp
#include <vector>
void remove_negatives(std::vector<int>& v) {
for (auto it = v.begin(); it != v.end(); ++it) {
if (*it < 0) {
v.erase(it);
}
}
}
このコードには、負の数が2つ以上含まれる入力で表面化するバグがあります。見つけて直してください。
答え
v.erase(it)はitを無効化します。その後ループの++itは無効化されたイテレータをインクリメントしてしまい — 未定義動作です。eraseはすでに次の要素を指す有効なイテレータを返すので、無条件にインクリメントする代わりにそれを使いましょう:
for (auto it = v.begin(); it != v.end(); ) {
if (*it < 0) it = v.erase(it);
else ++it;
}