C ++ erase / remove_if - удаляет только начало строки

0

Здесь str - string:

str.erase(std::remove_if(str.begin(), str.end(), &islower));

кажется, только удаляет строчные символы с передней стороны строки. Почему это и как его получить, чтобы удалить все строчные буквы в строке?

Теги:
stl

2 ответа

3
Лучший ответ

std::basic_string имеет две формы стирания с итераторами; первый для стирания одного символа в этой позиции, а второй для стирания символов из диапазона.

  1. iterator erase(iterator position);
  2. 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.

2

Вы делаете удаление - удаляете неправильно:

str.erase(std::remove_if(str.begin(), str.end(), &islower), str.end());
//                                                        ^^^^^^^^^^^

В вашем способе используется однопараметрическая перегрузка std::string::erase которая стирает один символ, а не перегрузку диапазона, которая стирает, ну, диапазон.

Прочтите документацию !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню