Algorithm Replace Copy If Function

C++ Algorithm replacecopyif function is used to make a copy of the range [first, last) to the range beginning at result, placing those for which pred returns true by new_value. It uses predicate pred instead of operator== to compare the elements.

This function examines each element in a source range and replaces it if it satisfies a specified predicate while copying the result into a new destination range.

Syntax

Example

template <class InputIterator, class OutputIterator, class UnaryPredicate, class T>
OutputIterator replace_copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred, const T& new_value);

Parameter

first : An input iterator pointing to the initial position in the range from which elements are being replaced.

last : A input iterator pointing to the final position in the range from which elements are being replaced.

result : An output iterator pointing to the first element of the range where the resulting sequence is stored.

pred : The unary predicate that must be satisfied if the value of an element is to be replaced.

old_value : The old value of the element being replaced.

new_value : The new value assigned to the element with the old value.

Return value

The replacecopyif function returns an output iterator pointing to the position thacpp tutorials to the last element written in the result sequence.

Complexity

Complexity is linear in the distance between first and last: Applies pred and performs an assignment for each element.

Data races

The objects in the range [first1, last1) are accessed.

The objects in the range within result and the returned value are modified.

Exception safety

This function throws an exception if any of pred, the element assignments or the operations on iterators throws an exception.

Please note that invalid parameters cause an undefined behavior.

Example 1

Let's see the simple example to demonstrate the use of replacecopyif:

Example

#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

int main() {
  vector<int> v = { 3,1,2,1,2 };

  replace_copy_if(v.begin(), v.end(),
    ostream_iterator<int>(cout, ","),
    [](int x) { return x%2 != 0; }, 10);
    
    return 0;
}

Output:

Output

10,10,2,10,2,

Example 2

Let's see another simple example:

Example

// CPP code to illustrate 
// replace_copy_if 
#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 
  
// Function to check if number is even 
int IsEven(int i) 
{ 
    return ((i % 2) == 0); 
} 
  
// Function to print content of vector 
void print(vector<int>& v) 
{ 
    int len = v.size(); 
    for (int i=0; i < len; i++) 
        cout << v[i] << " "; 
    cout << endl; 
} 
  
// Function to replace all even numbers from vector v1 and 
// copying them to v2 
void replace_copy_ifDemo(vector<int>& v1, vector<int>& v2) 
{ 
    replace_copy_if(v1.begin(), v1.end(), v2.begin(), IsEven, 0); 
} 
  
// Driver Code 
int main() 
{ 
    vector<int> v1, v2; 
  
    for (int i = 1; i <= 10; i++) 
        v1.push_back(i); 
  
    cout << "Before replace_copy_if: "; 
    print(v1); 
  
    v2.resize(v1.size()); // allocate space 
    replace_copy_ifDemo(v1, v2); 
  
    cout << "After replace_copy_if: "; 
    print(v2); 
  
    return 0; 
}

Output:

Output

Before replace_copy_if: 1 2 3 4 5 6 7 8 9 10 
After replace_copy_if: 1 0 3 0 5 0 7 0 9 0

Example 3

Let's see another simple example:

Example

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

int main()
{
    const int MAX_ELEMENTS = 8 ;

    // Define a template class vector of integers
    typedef vector<int > IntVector ;

    //Define an iterator for template class vector of integer
    typedef IntVector::iterator IntVectorIt ;

    //vector containing numbers
    IntVector Numbers(MAX_ELEMENTS), Result(MAX_ELEMENTS) ;

    IntVectorIt start, end, it, last, resultIt ;

    //Initialize vector Numbers
    Numbers[0] = 10 ;
    Numbers[1] = 20 ;
    Numbers[2] = 10 ;
    Numbers[3] = 15 ;
    Numbers[4] = 12 ;
    Numbers[5] = 7 ;
    Numbers[6] = 9 ;
    Numbers[7] = 10 ;

    start = Numbers.begin() ;   // location of first
                                // element of Numbers

    end = Numbers.end() ;       // one past the location
                                // last element of Numbers

    resultIt = Result.begin() ; // location of first
                                // element of Result

    // print content of Numbers
    cout << "Numbers { " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << " }\n" << endl ;

    // copy all elements from Numbers to Result
    // replacing any item that >= 10 with 30
    last = replace_copy_if(start, end, resultIt,
                           bind2nd(greater_equal<int>(), 10), 30) ;

    //print number of elements copied to Result
    cout << "Total number of elements copied to Result = "
        << last - resultIt << endl ;

    start = Result.begin() ;   // location of first
                                // element of Result

    end = Result.end() ;       // one past the location
                               // last element of Result

    // print content of Result
    cout << "Result  { " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << " }\n" << endl ;

}

Output:

Output

Numbers { 10 20 10 15 12 7 9 10  }

Total number of elements copied to Result = 8
Result  { 30 30 30 30 30 7 9 30  }

Example 4

Let's see another simple example:

Example

#include <vector>  
#include <list>  
#include <algorithm>  
#include <iostream>  
  
bool greater6 ( int value ) {  
   return value >6;  
}  
  
int main( ) {  
   using namespace std;  
   vector <int> v1;  
   list <int> L1 (13);  
   vector <int>::iterator Iter1;  
   list <int>::iterator L_Iter1;  
  
   int i;  
   for ( i = 0 ; i <= 9 ; i++ )  
      v1.push_back( i );  
  
   int ii;  
   for ( ii = 0 ; ii <= 3 ; ii++ )  
      v1.push_back( 7 );  
  
   random_shuffle ( v1.begin( ), v1.end( ) );  
  
   int iii;  
   for ( iii = 0 ; iii <= 13 ; iii++ )  
      v1.push_back( 1 );  
  
   cout << "The original vector v1 is:\n ( " ;  
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
      cout << *Iter1 << " ";  
   cout << ")." << endl;  
  
   // Replace elements with a value of 7 in the 1st half of a vector  
   // with a value of 70 and copy it into the 2nd half of the vector  
   replace_copy_if ( v1.begin( ), v1.begin( ) + 14,v1.end( ) -14,  
      greater6 , 70);  
  
   cout << "The vector v1 with values of 70 replacing those greater"  
        << "\n than 6 in the 1st half & copied into the 2nd half is:\n ( " ;  
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
      cout << *Iter1 << " ";  
   cout << ")." << endl;  
  
   // Replace elements in a vector with a value of 70  
   // with a value of 1 and copy into a list  
   replace_copy_if ( v1.begin( ), v1.begin( ) + 13,L1.begin( ),  
      greater6 , -1 );  
  
   cout << "A list copy of vector v1 with the value -1\n replacing "  
        << "those greater than 6 is:\n ( " ;  
   for ( L_Iter1 = L1.begin( ) ; L_Iter1 != L1.end( ) ; L_Iter1++ )  
      cout << *L_Iter1 << " ";  
   cout << ")." << endl;  
}

Output:

Output

The original vector v1 is:
 ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ).
The vector v1 with values of 70 replacing those greater
 than 6 in the 1st half & copied into the 2nd half is:
 ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 4 70 70 70 0 5 70 1 6 70 3 70 70 2 ).
A list copy of vector v1 with the value -1
 replacing those greater than 6 is:
 ( 4 -1 -1 -1 0 5 -1 1 6 -1 3 -1 -1 ).

Input Required

This code uses input(). Please provide values below: