Неправильное редактирование строки

Не знаю как решить одну проблему: После выполнения цикла, строка удаляет все НЕмаленькие символы (97-122 - это маленькие англ. символы).

Проблема заключатеся в том, что в строке есть цыфры (1960). Цикл оставляет 90 не трогает. Как мне удалить все цифры тоже

 string res = "the 1960s with the release of Letraset sheets containing Lorem";

// удаляем пробелы
for (int i = 0; i < res.size(); ++i) {
    for (int j = 0; j < res[i].size(); ++j) {
        if (res[i] == ' ')
            res[i].erase(res[i].begin() + res[i].find(res[i]));
    }
}

// заменяем большие символы на маленькие
for (int i = 0; i < res.size(); ++i) {
    for (int j = 0; j < res[i].size(); ++j) {
        if (isupper(res[i]))
            res[i] = tolower(res[i]);
    }
}

// удаляем остальные символы
for (int i = 0; i < res.size(); ++i) {
    for (int j = 0; j < res[i].size(); ++j) {
        if (res[i] < 97 || res[i] > 122)
            res[i].erase(res[i].begin() + res[i].find(res[i]));
    }
}

Ответы (1 шт):

Автор решения: AR Hovsepyan

Чтобы каждый раз не менять размер строки, эффективнее перемещать в конец все не буквы, а потом удалить эти перемещенные элементы. Заодно можно сразу заменить большие буквы на маленькие. Можно это сделать с помощью функтора:

//...
#include <algorithm>
//функтор,  определяющий является ли буквой символ 
//если да и бува большая, заменяет на маленькую
struct Checker {    
    bool operator ()(char& c) {
        bool b = isalpha(c);
        if (b && isupper(c))
            c = tolower(c);
        return !b;
    }
};

int main()
{     
     string res = "the 1960s with the release of Letraset sheets containing Lorem";
    //перемещаем в конец все сиволы по нашему функтору и сохраняем итератор на эту позицию
    auto p = std::remove_if(res.begin(), res.end(), Checker());
    //удаляем все элементы начиная с этой позиции
    res.erase(p, res.end());
    cout << res;
    return 0;
}

Или же, если хотите удалять каждый раз, то начинайте с конца, чтобы индекс не менялся:

int i = res.size();
while (--i >= 0) {        
    if (isalpha(res[i])) {
        if (isupper(res[i]))
            res[i] = tolower(res[i]);           
    }
    //если это не буква, то удаляем один элемент на этой позиции    
    else 
        res.erase(i, 1);        
}
→ Ссылка