Namara

毎日コード。手助けなし。

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;
}