bool BothAreSpaces(char lhs, char rhs) { return (lhs == rhs) && (lhs == ' '); }
std::string::iterator new_end = std::unique(str.begin(), str.end(), BothAreSpaces);
str.erase(new_end, str.end());
Как это работает.std::unique
имеет две формы.Первая форма проходит через диапазон и удаляет соседние дубликаты.Таким образом, строка «abbaaabbbb» становится «abab».Вторая форма, которую я использовал, принимает предикат, который должен принимать два элемента и возвращать true, если они должны рассматриваться как дубликаты.Функция, которую я написал, BothAreSpaces
, служит этой цели.Он точно определяет, что подразумевается под его именем, что оба его параметра являются пробелами.Таким образом, при объединении с std::unique
дублирующиеся соседние пробелы удаляются.
Так же, как std::remove
и remove_if
, std::unique
фактически не создаетконтейнер меньше, он просто перемещает элементы в конце ближе к началу.Он возвращает итератор в новый конец диапазона, так что вы можете использовать его для вызова функции erase
, которая является функцией-членом строкового класса.
Разбивая ее,Функция стирания принимает два параметра, итератор начала и конца для диапазона, который нужно стереть.Для первого параметра я передаю возвращаемое значение std::unique
, потому что именно здесь я хочу начать стирание.Для второго параметра я передаю итератор конца строки.