Здесь str
- string
:
str.erase(std::remove_if(str.begin(), str.end(), &islower));
кажется, только удаляет строчные символы с передней стороны строки. Почему это и как его получить, чтобы удалить все строчные буквы в строке?
std::basic_string
имеет две формы стирания с итераторами; первый для стирания одного символа в этой позиции, а второй для стирания символов из диапазона.
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
Попробуйте две формы аргумента:
str.erase(std::remove_if(str.begin(), str.end(), &islower), str.end());
Он удалит данные в диапазоне от first
до last
, за исключением last
(таким образом [first; last)
), из позиции, возвращенной в результате remove_if
до конца строки.
Это обычно известно как идиома erase-remove.
Вы делаете удаление - удаляете неправильно:
str.erase(std::remove_if(str.begin(), str.end(), &islower), str.end());
// ^^^^^^^^^^^
В вашем способе используется однопараметрическая перегрузка std::string::erase
которая стирает один символ, а не перегрузку диапазона, которая стирает, ну, диапазон.