std::remove_copy, std::remove_copy_if
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <algorithm>
|
||
template< class InputIt, class OutputIt, class T > OutputIt remove_copy( InputIt first, InputIt last, OutputIt d_first, const T& value ); |
(1) | |
template< class InputIt, class OutputIt, class UnaryPredicate > OutputIt remove_copy_if( InputIt first, InputIt last, OutputIt d_first, UnaryPredicate p ); |
(2) | |
Копирует элементы из диапазона [first, last) в диапазон, начинающийся с d_first, кроме тех элементов, которые удовлетворяют определенному условию. Первый вариант игнорирует элементы, равные value, второй вариант игнорирует элементы, для которых предикат p возвращает true. Исходный и целевой диапазоны не должны пересекаться.
Параметры
[first, last)
|
— | два итератора задающих диапазон элементов для копирования |
| d_first | — | начало целевого диапазона |
| value | — | значение элементов, которые не следует копировать |
| Требования к типам | ||
-InputIt должен соответствовать требованиям InputIterator.
| ||
-OutputIt должен соответствовать требованиям OutputIterator.
| ||
Возвращаемое значение
Итератор на элемент, следующий за последним скопированным.
Сложность
Ровно last - first применений предиката.
Возможная реализация
| Первый вариант |
|---|
template<class InputIt, class OutputIt, class T>
OutputIt remove_copy(InputIt first, InputIt last,
OutputIt d_first, const T& value)
{
for (; first != last; ++first) {
if (!(*first == value)) {
*d_first++ = *first;
}
}
return d_first;
}
|
| Второй вариант |
template<class InputIt, class OutputIt, class UnaryPredicate>
OutputIt remove_copy_if(InputIt first, InputIt last,
OutputIt d_first, UnaryPredicate p)
{
for (; first != last; ++first) {
if (!p(*first)) {
*d_first++ = *first;
}
}
return d_first;
}
|
Пример
Следующий код выводит строку, удаляя на ходу пробелы.
Запустить этот код
#include <algorithm>
#include <iterator>
#include <string>
#include <iostream>
int main()
{
std::string str = "Текст с несколькими пробелами";
std::cout << "до: " << str << "\n";
std::cout << "после: ";
std::remove_copy(str.begin(), str.end(),
std::ostream_iterator<char>(std::cout), ' ');
std::cout << '\n';
}
Вывод:
до: Текст с несколькими пробелами
после: Текстснесколькимипробелами
См. также
| удаляет элементы, соответствующие определённым критериям (шаблон функции) |