Вы используете неправильную erase()
перегрузку. Вы вызываете перегрузку erase()
, которая принимает один параметр итератора, итератор для одного символа, который будет удален из строки.
std::remove_if
«удаляет» значения из последовательности, просто перемещая их до конца, а затем возвращает новое значение итератора «окончание последовательности». Ваш неправильный перегруз erase()
удаляет только символ после новой последовательности. Если бы ничего не было удалено, вы бы передали end()
в erase()
, что привело бы к неопределенному поведению и вероятному взлому sh. Но в этом случае вам повезло.
Чтобы полностью удалить «удаленные» символы, которые были перемещены в конец строки, передайте итератор строки end()
в erase()
:
rrr.erase( /* What you already have */, rrr.end());
Ваша книга по С ++ или справочное руководство по С ++ должна иметь полный список всех доступных перегрузок erase()
, включая тот, который вы должны были использовать здесь, и объяснение того, что они делают.