C++:
Удаление символов, соответствующих шаблону
Как это сделать:
Давайте удалим символы, используя erase
и remove_if
наряду с лямбда-выражениями. Вот быстрый пример:
#include <iostream>
#include <algorithm>
#include <string>
int main() {
std::string data = "B4n4n4!";
// Удалить все числовые символы
data.erase(std::remove_if(data.begin(), data.end(), ::isdigit), data.end());
std::cout << data << std::endl; // Вывод: Bnn!
return 0;
}
Пример вывода:
Bnn!
Погружение в детали
Алгоритм std::remove_if
из заголовочного файла <algorithm>
на самом деле не уменьшает строку; он переупорядочивает элементы и возвращает указатель на новый логический конец. Метод erase
класса std::string
затем удаляет “мертвую древесину” с конца. Эта комбинация появилась в C++98 и остается эффективной и популярной.
Альтернативы? Для сложных шаблонов regex (<regex>
) - ваш нож швейцарского армейца. Но это избыточно для простых задач.
Детали? std::remove_if
и подобные алгоритмы опираются на итераторы, которые C++ заимствовал из Библиотеки Шаблонов Стандарта (STL) в середине 90-х. Они поддерживают универсальное программирование, гарантируя, что ваш код изменения и замены работает со строками, списками, назовите как угодно.
Смотрите также
- Справочник по C++ для
std::remove_if
: https://en.cppreference.com/w/cpp/algorithm/remove - Справочник по C++ для
std::string::erase
: https://en.cppreference.com/w/cpp/string/basic_string/erase - Больше о итераторах в C++: https://en.cppreference.com/w/cpp/iterator
- Когда использовать
std::regex
для сопоставления с шаблоном: https://en.cppreference.com/w/cpp/regex