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
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:
#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:
10,10,2,10,2,
Example 2
Let's see another simple 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:
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:
#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:
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:
#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:
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 ).