Per quelli di voi che preferiscono uno stile di codifica lambda più conciso e più facile da leggere ...
Questo esempio rimuove tutti i caratteri non alfanumerici e gli spazi vuoti da una stringa ampia. Puoi mescolarlo con una qualsiasi delle altre funzioni di supporto di ctype.h per rimuovere test basati sui caratteri dall'aspetto complesso.
(Non sono sicuro di come queste funzioni gestiscano i linguaggi CJK, quindi cammina dolcemente lì.)
// Boring C loops: 'for(int i=0;i<str.size();i++)'
// Boring C++ eqivalent: 'for(iterator iter=c.begin; iter != c.end; ++iter)'
Vedi se non trovi questo più facile da capire rispetto ai rumorosi C / C ++ per i cicli / 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());
});
risultati newLabel dopo aver eseguito questo codice: " 1ReplenMoveRPMV "
Questo è solo accademico, poiché sarebbe chiaramente più preciso, conciso ed efficiente combinare la logica 'if' da lambda0 (primo for_each ) nel singolo lambda1 (secondo for_each ), se hai già stabilito quali caratteri sono i "badChars" .