Я не понимаю, как сделать remove_if не в C++
Этот код работает, но он немного ограничен, поэтому я хочу удалить что-то, если оно не равно букве.
Я знаю, что должен использовать:: isalpha вместо:: ispunct, но я не понимаю, как заставить его удалить, если он не равен:: isalpha. Я задумала этот вопрос, но нигде не получила ответов, потому что не поняла их.
textFile[i].erase(remove_if(textFile[i].begin(), textFile[i].end(), ::ispunct), textFile[i].end());
Любая помощь приветствуется.
1 ответ
Решение
Я не скомпилировал, но это должно работать:
textFile[i].erase(
remove_if(textFile[i].begin(), textFile[i].end(), std::not1(std::ptr_fun(::isalpha))),
textFile[i].end());
Интересующие ссылки здесь:
- http://www.cplusplus.com/reference/std/functional/ptr_fun/
- http://www.cplusplus.com/reference/std/functional/not1/
Если стандартных функторов недостаточно, вы также можете реализовать свой собственный:
struct not_a_character : std::unary_function<char, bool> {
bool operator()(char c) const {
return !isalpha(c);
}
};
Который может быть использован как:
textFile[i].erase(
remove_if(textFile[i].begin(), textFile[i].end(), not_a_character()),
textFile[i].end());