Напишите функцию, которая принимает char
и возвращает true
, если вы хотите удалить этот символ, или false
, если вы хотите сохранить его:
bool my_predicate(char c);
Затем используйте алгоритм std::remove_if
для удаления нежелательных символов из строки:
std::string s = "my data";
s.erase(std::remove_if(s.begin(), s.end(), my_predicate), s.end());
В зависимости от ваших требований вы можете использовать один из предикатов стандартной библиотеки, например std::isalnum
, вместо написания своего собственного предиката (вы сказали, что вам необходимо сопоставлять буквенно-цифровые символы и пробелы, поэтому, возможно, это точно подходит то, что вам нужно).
Если вы хотите использовать функцию std::isalnum
Стандартной библиотеки, вам понадобится приведение для устранения неоднозначности между функцией std::isalnum
в заголовке стандартной библиотеки С <cctype>
(той, которую вы хотите использовать) и std::isalnum
в заголовке стандартной библиотеки C ++ <locale>
(это не тот файл, который вы хотите использовать, если только вы не хотите выполнять обработку строк, зависящую от локали):
s.erase(std::remove_if(s.begin(), s.end(), (int(*)(int))std::isalnum), s.end());
Это одинаково хорошо работает с любым из контейнеров последовательности (включая std::string
, std::vector
и std::deque
). Эта идиома обычно упоминается как идиома «стереть / удалить». Алгоритм std::remove_if
также будет работать с обычными массивами. std::remove_if
делает только один проход по последовательности, поэтому он имеет линейную сложность по времени.