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. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции)  | |