Pour ceux d'entre vous qui préfèrent un style de codage lambda plus concis et plus facile à lire ...
Cet exemple supprime tous les caractères non alphanumériques et d'espaces blancs d'une chaîne large. Vous pouvez le mélanger avec l'un des autres ctype.h fonctions d'assistance pour supprimer des tests basés sur des caractères complexes.
(Je ne sais pas comment ces fonctions géreraient les langues CJK, alors marchez doucement.)
// Boring C loops: 'for(int i=0;i<str.size();i++)'
// Boring C++ eqivalent: 'for(iterator iter=c.begin; iter != c.end; ++iter)'
Voyez si vous ne trouvez pas cela plus facile à comprendre que le C / C ++ bruyant pour les boucles / 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 résultats après l'exécution de ce code: " 1ReplenMoveRPMV "
Ceci est juste académique, car il serait clairement plus précis, concis et efficace de combiner la logique 'if' de lambda0 (premier for_each ) dans le seul lambda1 (deuxième for_each ), si vous avez déjà établi quels caractères sont les "badChars" .