Для тих, хто віддає перевагу більш лаконічному, легшому для читання стилю кодування лямбда ...
Цей приклад видаляє всі нелітерально-цифрові та пробіли з широкого рядка. Ви можете змішати його з будь-якими іншими допоміжними функціями ctype.h, щоб видалити складні тести на основі символів.
(Я не впевнений, як ці функції працювали б з мовами CJK, тому ходіть там тихо.)
// Boring C loops: 'for(int i=0;i<str.size();i++)'
// Boring C++ eqivalent: 'for(iterator iter=c.begin; iter != c.end; ++iter)'
Подивіться, чи вам це не легше зрозуміти, ніж галасливий C / C ++ для циклів / 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 після запуску цього коду: " 1ReplenMoveRPMV "
Це просто академічно, оскільки, очевидно, було б більш точним, стислим та ефективним поєднати логіку 'if' з lambda0 (перший for_each ) в єдиний lambda1 (другий for_each ), якщо ви вже встановили, які символи є "badChars" .