std::replace_copy, std::replace_copy_if

From Cppreference

Jump to: navigation, search
Defined in header <algorithm>

template< class InputIterator, class OutputIterator, class T >

OutputIterator replace_copy( InputIterator first,
                             InputIterator last,
                             OutputIterator d_first,
                             const T& old_value,

                             const T& new_value );
(1)
template< class InputIterator, class OutputIterator, class UnaryPredicate, class T >

OutputIterator replace_copy_if( InputIterator first,
                                InputIterator last,
                                OutputIterator d_first,
                                UnaryPredicate p,

                                const T& new_value );
(2)

Copies the all elements from the range [first, last) to another range beginning at d_first replacing all elements satisfying specific criteria with new_value. The first version replaces the elements that are equal to old_value, the second version replaces elements for which predicate p returns true.

Contents

Parameters

first, last - the range of elements to copy
d_first - the beginning of the destination range
old_value - the value of elements to replace
p - unary predicate which returns ​true if the element value should be replaced.

The signature of the predicate function should be equivalent to the following:

bool pred(const Type &a);

The signature does not need to have const &, but the function must not modify the objects passed to it.
The type ​Type​ must be such that an object of type ​ForwardIterator​ can be dereferenced and then implicitly converted to ​Type​. ​

new_value - the value to use as replacement

Return value

iterator to the element past the last element copied.

Complexity

linear in the distance between first and last

Equivalent function

First version:
template<class InputIterator, class OutputIterator, class T>
OutputIterator replace_copy(InputIterator first,
                            InputIterator last,
                            OutputIterator 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;
}
Second version:
template<class InputIterator, class OutputIterator, class UnaryPredicate, class T>
OutputIterator replace_copy_if(InputIterator first,
                               InputIterator last,
                               OutputIterator d_first,
                               UnaryPredicate p,
                               const T& new_value)
{
    for (; first != last; ++first) {
        *d_first++ = (p( *first ) ? new_value : *first;
    }
    return d_first;
}

Example

See also

remove
remove_if
removes elements satisfying specific criteria
(function template)
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
In other languages