Для тех из вас, кто предпочитает более лаконичный и легкий для чтения стиль лямбда-кодирования ...
В этом примере удаляются все не алфавитно-цифровые и пробельные символы из широкой строки. Вы можете смешать его с любыми другими вспомогательными функциями 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 ++ для / итератора:
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 "
Это просто академический подход, поскольку было бы более точным, лаконичным и эффективным объединить логику «если» из lambda0 (первая for_each ) в одну лямбда1 (вторая for_each * 1020). *), если вы уже установили, какие символы являются «badChars».