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 ForwardItmust meet the requirements ofMoveAssignable. | ||
[править] Возвращаемое значение
Итератор на новый конец диапазона.
[править] Сложность
Ровно 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. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) | |


