Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) std::replace_if

 

std::replace_if is an STL algorithm to replace elements of a sequence (on a std::vector, for example) that satisfy a certain predicate. Use std::replace if no predicate is needed (that is: a certain value must always be replaced).

 

Prefer algorithms over hand-written loops [1-3]. Exercise #9: No for-loops shows how to remove hand-written loops.

 

 

 

 

 

Example

 

The code below shows how to replace all values that are negative to zero:

 

#include <algorithm>
#include <numeric>
#include <vector>

//From http://www.richelbilderbeek.nl/CppReplaceNegativeByZero.htm
void ReplaceNegativeByZero(std::vector<int>& v)
{
  std::replace_if(v.begin(),v.end(),
    std::bind2nd(std::less<int>(),0),0);
}

 

 

 

 

 

replace_if function definition

 

Simplified and modified from the STL that ships with C++ Builder 6.0:

 

template
<
  class ForwardIter,
  class Predicate,
  class Tp
>
void replace_if(
  ForwardIter first,
  const ForwardIter last,
  const Predicate pred,
  const Tp& newvalue)
{
  for ( ; first != last; ++first)
  {
    if (pred(*first))
    {
      *first = newvalue;
    }
  }
}

 

 

 

 

 

External links

 

 

 

 

 

 

References

 

  1. Bjarne Stroustrup. The C++ Programming Language (3rd edition). ISBN: 0-201-88954-4. Chapter 18.12.1 : 'Prefer algorithms over loops'
  2. Herb Sutter and Andrei Alexandrescu. C++ coding standards: 101 rules, guidelines, and best practices. ISBN: 0-32-111358-6. Chapter 84: 'Prefer algorithm calls to handwritten loops.'
  3. Herb Sutter and Andrei Alexandrescu. C++ coding standards: 101 rules, guidelines, and best practices. ISBN: 0-32-111358-6. Chapter 88: 'Prefer function objects over functions as algorithm and comparer arguments.'

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict