std::remove, std::remove_if
| Определено в заголовочном файле <algorithm>
|
||
| template< class ForwardIt, class T > ForwardIt remove( ForwardIt first, ForwardIt last, const T& value ); |
(1) | |
| template< class ForwardIt, class UnaryPredicate > ForwardIt remove_if( ForwardIt first, ForwardIt last, UnaryPredicate p ); |
(2) | |
Удаляет из диапазона [first, last) все элементы, удовлетворяющие определенному условию. Первый вариант удаляет все элементы, равные value, второй вариант удаляет все элементы, для которых предикат p возвращает true.
Удаление осуществляется путём сдвига элементов внутри диапазона таким образом, что удаляемые элементы перезаписываются. Элементы между старым и новым концами диапазона имеют неопределённое значение. Возвращается итератор на новый конец диапазона. Относительный порядок оставшихся элементов сохраняется.
Содержание |
[править] Параметры
| first, last | - | диапазон элементов для обработки |
| value | - | значение удаляемых элементов |
| p | - | унарный предикат, который возвращаетtrue , если элемент должен быть удален. Определение функции предиката должны быть эквивалентно следующему: bool pred(const Type &a); Определение не должно иметь const &, но функция не должна модифицировать принимаемые объекты. |
| Требования к типам | ||
-ForwardIt должен соответствовать требованиям ForwardIterator.
| ||
-The type of dereferenced ForwardIt must meet the requirements of MoveAssignable.
| ||
[править] Возвращаемое значение
Итератор на новый конец диапазона.
[править] Сложность
Ровно std::distance(first, last) применений предиката.
[править] Примечания
Одноимённые функции-члены контейнеров list::remove, list::remove_if, forward_list::remove и forward_list::remove_if удаляют элементы полностью (стирают).
[править] Возможная реализация
| Первый вариант |
|---|
template<class ForwardIt, class T> ForwardIt remove(ForwardIt first, ForwardIt last, const T& value) { ForwardIt result = first; for (; first != last; ++first) { if (!(*first == value)) { *result++ = *first; } } return result; } |
| Второй вариант |
template<class ForwardIt, class UnaryPredicate> ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p) { ForwardIt result = first; for (; first != last; ++first) { if (!p(*first)) { *result++ = *first; } } return result; } |
[править] Пример
Следующий код удаляет все пробелы из строки, перемещая их в её конец, а затем стирая.
#include <algorithm> #include <string> #include <iostream> int main() { std::string str = "Текст с несколькими пробелами"; str.erase(std::remove(str.begin(), str.end(), ' '), str.end()); std::cout << str << '\n'; }
Вывод:
Текстснесколькимипробелами
[править] См. также
| Копирует диапазон элементов опуская те, которые удовлетворяют определенным критериям Оригинал: copies a range of elements omitting those that satisfy specific criteria Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) | |