Für diejenigen unter Ihnen, die einen prägnanteren, leichter zu lesenden Lambda-Codierungsstil bevorzugen ...
In diesem Beispiel werden alle nicht alphanumerischen Zeichen und Leerzeichen aus einer breiten Zeichenfolge entfernt. Sie können es mit jedem anderen ctype.h verwechseln , um komplex aussehende Tests zu entfernen.
(Ich bin mir nicht sicher, wie diese Funktionen mit CJK-Sprachen umgehen würden. Gehen Sie also leise dorthin.)
// Boring C loops: 'for(int i=0;i<str.size();i++)'
// Boring C++ eqivalent: 'for(iterator iter=c.begin; iter != c.end; ++iter)'
Sehen Sie, ob Sie dies nicht einfacher zu verstehen finden als verrauschte C / C ++ for / iterator-Schleifen:
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 ergibt sich nach Ausführung dieses Codes: " 1ReplenMoveRPMV "
Dies ist nur akademisch, da es eindeutig präziser, prägnanter und effizienter wäre, die 'if'-Logik von lambda0 (first for_each ) in das einzelne lambda1 (second for_each ) zu kombinieren , wenn Sie bereits festgestellt haben, welche Zeichen die "badChars" sind. .