Para aqueles que preferem um estilo de codificação lambda mais conciso e fácil de ler ...
Este exemplo remove todos os caracteres não alfanuméricos e de espaço em branco de uma string larga. Você pode misturá-lo com qualquer um dos outros ctype.h funções auxiliares para remover testes baseados em caracteres de aparência complexa.
(Não tenho certeza de como essas funções lidariam com as linguagens CJK, então vá com cuidado.)
// Boring C loops: 'for(int i=0;i<str.size();i++)'
// Boring C++ eqivalent: 'for(iterator iter=c.begin; iter != c.end; ++iter)'
Veja se você não acha isso mais fácil de entender do que loops barulhentos em C / C ++ para / iterador:
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 resulta após executar este código: " 1ReplenMoveRPMV "
Este é apenas acadêmica, uma vez que seria claramente mais precisa, concisa e eficiente para combinar a lógica 'se' a partir lambda0 (primeira for_each ) no único lambda1 (segunda for_each ), se você já estabeleceu que os personagens são os "badChars" .