std::replace_copy, std::replace_copy_if
| Определено в заголовочном файле <algorithm>
|
||
template< class InputIt, class OutputIt, class T > OutputIt replace_copy( InputIt first, InputIt last, OutputIt d_first, const T& old_value, const T& new_value ); |
(1) | |
template< class InputIt, class OutputIt, class UnaryPredicate, class T > OutputIt replace_copy_if( InputIt first, InputIt last, OutputIt d_first, UnaryPredicate p, const T& new_value ); |
(2) | |
Копирует все элементы из диапазона [first, last) в диапазон, начинающийся с d_first, заменяя все элементы, удовлетворяющие определенному условию, на new_value. Первый вариант заменяет элементы, равные old_value, второй вариант заменяет элементы, для которых предикат p возвращает true. Исходный и целевой диапазоны не должны пересекаться.
Параметры
[first, last)
|
— | два итератора задающих диапазон элементов для копирования |
| d_first | — | начало целевого диапазона |
| old_value | — | значение элементов, которые следует заменить |
| p | — | унарный предикат, который возвращаетtrue , если значение элемента должно быть заменено. Определение функции предиката должно быть эквивалентно следующему:
Присутствие |
| new_value | — | значение, используемое в качестве замены |
| Требования к типам | ||
-InputIt должен соответствовать требованиям InputIterator.
| ||
-OutputIt должен соответствовать требованиям OutputIterator.
| ||
Возвращаемое значение
Итератор на элемент, следующий после последнего скопированного.
Сложность
Ровно last - first применений предиката.
Возможная реализация
| Первый вариант |
|---|
template<class InputIt, class OutputIt, class T>
OutputIt replace_copy(InputIt first, InputIt last, OutputIt d_first,
const T& old_value, const T& new_value)
{
for (; first != last; ++first) {
*d_first++ = (*first == old_value) ? new_value : *first;
}
return d_first;
}
|
| Второй вариант |
template<class InputIt, class OutputIt,
class UnaryPredicate, class T>
OutputIt replace_copy_if(InputIt first, InputIt last, OutputIt d_first,
UnaryPredicate p, const T& new_value)
{
for (; first != last; ++first) {
*d_first++ = p( *first ) ? new_value : *first;
}
return d_first;
}
|
Пример
Следующий код печатает вектор, заменяя на ходу все значения, большее 5, на 99.
#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
#include <functional>
int main()
{
std::vector<int> v{5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
std::replace_copy_if(v.begin(), v.end(),
std::ostream_iterator<int>(std::cout, " "),
[](int n){return n > 5;}, 99);
std::cout << '\n';
}
Вывод:
5 99 4 2 99 99 1 99 0 3
См. также
| удаляет элементы, соответствующие определённым критериям (шаблон функции) |