POW ma już dobrą odpowiedź jeśli trzeba wynik jako nowy ciąg znaków. Ta odpowiedź brzmi, jak sobie z tym poradzić, jeśli chcesz przeprowadzić aktualizację w miejscu.
Pierwsza część przepisu to std::remove_if
, dzięki czemu można skutecznie usunąć interpunkcję, pakując wszystkie nie-interpunkcje w toku.
std::remove_if (text.begin(), text.end(), ispunct)
Niestety, std::remove_if
nie zmniejsza łańcucha do nowego rozmiaru. Nie może, ponieważ nie ma dostępu do samego kontenera. Dlatego w wyniku po spakowanych wynikach pozostały niepotrzebne znaki.
Aby obsłużyć to, std::remove_if
zwraca iterator, który wskazuje część ciąg, który jest nadal potrzebny. To może być używany z ciągów erase
metody, prowadzące do następnego idiomu ...
text.erase (std::remove_if (text.begin(), text.end(), ispunct), text.end());
[EDIT - Nie mogę uwierzyć, że ja właśnie tak - że iteratorów dla erase
powinno wskazywać zakres usunąć , a nie zakres do zachowania.]
Ja nazywam to idiomem, ponieważ jest to powszechna technika, która działa w wielu sytuacjach.Inne typy niż string
zapewniają odpowiednie metody erase
i std::remove
(i prawdopodobnie niektóre inne funkcje biblioteki algorytmów, o których zapomniałem w tej chwili) przyjmują takie podejście do zamykania przerw na elementy, które usuwają, ale pozostawiają zmianę rozmiaru kontenera dla osoby dzwoniącej.
Powinieneś sprawdzić wszystkie znaki jeden po drugim. –