Algorithm Replace Copy If Function - C++ Programming Tutorial
C++ Course / STL Algorithm / Algorithm Replace Copy If Function

Algorithm Replace Copy If Function

BLUF: Mastering Algorithm Replace Copy If Function is a critical step in becoming a proficient C++ developer. This lesson provides a deep dive into the syntax, performance considerations, and real-world applications of this concept.
Key Performance Insight: Algorithm Replace Copy If Function

C++ is renowned for its efficiency. Learn how Algorithm Replace Copy If Function enables low-level control and high-performance computing in the tutorial below.

The replacecopyif function in C++ Algorithm is employed to duplicate the [first, last) range into a new range starting at result. Elements meeting the condition specified by pred are replaced with new_value. This function relies on the predicate pred for element comparison instead of operator==.

This function evaluates every item within a given range and substitutes it if it meets a specified condition, all while duplicating the outcome to a separate target 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

An input iterator pointing to the starting position within the range where elements are being substituted.

The last parameter is an input iterator that points to the final position within the range where elements are being substituted.

An output iterator indicating the initial element of the range where the resultant sequence is stored.

The unary predicate that needs to be met in order to replace the value of an element.

The previous value: The value that was originally assigned to the element before the replacement.

The updated value that is assigned to the element with the previous value.

Return value

The replacecopyif function produces an output iterator that points to the position right after the last element copied into the resulting sequence.

Complexity

The complexity scales linearly with the distance from the initial to the final element: It applies a predetermined function and assigns a value to every individual element.

Data races

The elements within the range [first1, last1) are being retrieved.

The items within the specified range in the outcome and the value that is returned undergo alterations.

Exception safety

This function will raise an exception if any of the predicate, element assignments, or iterator operations throw an exception.

Please be aware that providing invalid parameters can lead to unpredictable outcomes.

Example 1

Let's explore a straightforward example to illustrate the functionality of the replacecopyif method:

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:

Logic Practice
Install Logic Practice
Add to home screen for a faster app-like experience