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
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:
#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 ).