Dla tych z Was, którzy wolą bardziej zwięzły, łatwiejszy do odczytania styl kodowania lambda ...
Ten przykład usuwa wszystkie znaki inne niż alfanumeryczne i białe znaki z szerokiego ciągu. Możesz go zmieszać z innymi funkcjami pomocniczymi ctype.h, aby usunąć złożone testy znakowe.
(Nie jestem pewien, jak te funkcje poradziłyby sobie z językami CJK, więc idź tam cicho).
// Boring C loops: 'for(int i=0;i<str.size();i++)'
// Boring C++ eqivalent: 'for(iterator iter=c.begin; iter != c.end; ++iter)'
Sprawdź, czy nie jest to łatwiejsze do zrozumienia niż hałaśliwe pętle C / C ++ for / iterator:
TSTRING label = _T("1. Replen & Move RPMV");
TSTRING newLabel = label;
set<TCHAR> badChars; // Use ispunct, isalpha, isdigit, et.al. (lambda version, with capture list parameter(s) example; handiest thing since sliced bread)
for_each(label.begin(), label.end(), [&badChars](TCHAR n){
if (!isalpha(n) && !isdigit(n))
badChars.insert(n);
});
for_each(badChars.begin(), badChars.end(), [&newLabel](TCHAR n){
newLabel.erase(std::remove(newLabel.begin(), newLabel.end(), n), newLabel.end());
});
newLabel wyniki po uruchomieniu tego kodu: „ 1ReplenMoveRPMV ”
To jest tylko akademickie, ponieważ byłoby wyraźnie bardziej precyzyjne, zwięzłe i wydajniejsze połączenie logiki „if” z lambda0 (pierwsza for_each ) w pojedynczą lambda1 (druga for_each ), jeśli już ustaliłeś, które znaki są „badChars” .