std::replace, std::replace_if

From Cppreference

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

template< class ForwardIterator, class T >

void replace( ForwardIterator first, ForwardIterator last,

              const T& old_value, const T& new_value );
(1)
template< class ForwardIterator, class UnaryPredicate, class T >

void replace_if( ForwardIterator first, ForwardIterator last,

                 UnaryPredicate p, const T& new_value );
(2)

Replaces all elements satisfying specific criteria with new_value in the range [first, last). The first version replaces the elements that are equal to old_value, the second version replaces elements for which predicate p returns true.

Contents

[edit] Parameters

first, last - the range of elements to process
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

[edit] Return value

(none)

[edit] Complexity

linear in the distance between first and last

[edit] Equivalent function

First version:
template<class ForwardIterator, class T>
void replace(ForwardIterator first, ForwardIterator last,
             const T& old_value, const T& new_value)
{
    for (; first != last; ++first) {
        if (*first == old_value) {
            *first = new_value;
        }
    }
}
Second version:
template<class ForwardIterator, class UnaryPredicate, class T>
void replace_if(ForwardIterator first, ForwardIterator last,
                UnaryPredicate p, const T& new_value)
{
    for (; first != last; ++first) {
        if(p(*first)) {
            *first = new_value;
        }
    }
}

[edit] Example

#include <algorithm>
#include <array>
#include <iostream>
#include <functional>
 
int main()
{
    std::array<int> s{5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
 
    std::replace(s.begin(), s.end(), 8, 99);
 
    for (int a : s) {
        std::cout << a << " ";
    }
    std::cout << endl;
 
    std::replace_if(s.begin(), s.end(), std::bind(std::less<int>(), 5), 99);
    for (int a : s) {
        std::cout << a << " ";
    } 
 
    return 0;
}

Output:

​5 7 4 2 99 6 1 9 0 3
5 7 99 99 99 6 99 9 99 99​

[edit] See also

replace_copy
replace_copy_if
copies a range, replacing elements satisfying specific criteria with another value
(function template)
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
In other languages