C++ Algorithm removecopyif function is employed to duplicate all elements within the specified range [first, last) to the range that starts at the result position, excluding the elements that satisfy the condition where pred returns true, while ensuring the sequence of the remaining elements is preserved.
This function is unable to change the dimensions of the container.
- It provides an iterator pointing to the updated end of the range.
- Stable removal ensures that the positions of the elements not eliminated remain unchanged.
Syntax
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator remove_copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred);
Parameter
A forward iterator indicating the location of the initial element within the range from which elements are being deleted.
The last parameter is a forward iterator that points to the position immediately following the last element in the range from which elements are being deleted.
An outcome iterator indicating the starting point of the range from which elements are being deleted.
That which needs to be fulfilled is the value that will replace an element.
Return value
A forward iterator indicating the updated endpoint (last) of the duplicated range, encompassing all elements within [first, last) excluding those that satisfy the pred condition.
Complexity
The complexity increases linearly within the specified range [first, last) when the pred function is applied to each element. Additionally, assignment operations are carried out only on elements that are not excluded.
Data races
The elements within the range [first, last) are being accessed.
The items within the range from the result to the value that is returned undergo modifications.
Exceptions
This function will raise an exception if any errors occur during the evaluation of the predicate, element assignment, or iterator operations.
Please be aware that providing incorrect parameters can lead to unpredictable behavior.
Example 1
Let's examine a straightforward example to illustrate the functionality of removecopyif:
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main() {
vector<int> v = { 2,1,3,4,5,7,6,9,8};
remove_copy_if(v.begin(), v.end(),
ostream_iterator<int>(cout, ","),
[](int x) { return x%2 != 0; });
return 0;
}
Output:
2,4,6,8,
Example 2
Let's see another simple example:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool IsOdd(int i) {
return ((i % 2) != 0);
}
// Function to remove from v1 result vector is v2
void remove_copy_ifDemo(vector <int> &v1, vector<int> &v2)
{
remove_copy_if(v1.begin(), v1.end(), v2.begin(), IsOdd);
}
// 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;
}
int main()
{
// declare vector v1, v2
vector <int> v1, v2(10);
// push data in vector
for(int i = 10; i <= 20; i++)
v1.push_back(i);
cout << "elements of v1 before remove_copy: ";
print(v1);
remove_copy_ifDemo(v1,v2);
cout << "elements of v1 after remove_copy: ";
print(v1);
cout << "After removing Odd Numbers from v1"
" copy result in vector v2" <<endl;
print(v2);
return 0;
}
Output:
elements of v1 before remove_copy: 10 11 12 13 14 15 16 17 18 19 20
elements of v1 after remove_copy: 10 11 12 13 14 15 16 17 18 19 20
After removing Odd Numbers from v1 copy result in vector v2
10 12 14 16 18 20 0 0 0 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] = 25 ;
Numbers[6] = 30 ;
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
// skipping any item that >= 25
last = remove_copy_if(start, end, resultIt,
bind2nd(greater_equal<int>(), 25)) ;
//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 ;
return 0;
}
Output:
Numbers { 10 20 10 15 12 25 30 10 }
Total number of elements copied to Result = 6
Result { 10 20 10 15 12 10 0 0 }
Example 4
Let's see another simple example:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool greathan(int value)
{ return value >7;}
int main(void)
{
// vector container
vector <int> vec1, vec2(14);
// vector iterator
vector <int>::iterator Iter1, Iter2, new_end;
int i, j;
// push data in range
for(i = 0; i <= 10; i++)
vec1.push_back(i);
for(j = 0; j <= 2; j++)
vec1.push_back(5);
// print the data
cout<<"The original vec1 vector data: ";
for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
cout<<*Iter1<<" ";
cout<<endl;
// randomly shuffle the data
random_shuffle(vec1.begin(), vec1.end());
cout<<"\nThe original vec1 vector data randomly shuffled: ";
for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
cout<<*Iter1<<" ";
cout<<endl;
// remove elements with a value greater than 7
new_end = remove_copy_if(vec1.begin(), vec1.end(), vec2.begin(), greathan);
cout<<"\nAfter the remove_copy_if() operation, the vec1 vector is left unchanged as: ";
for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
cout<<*Iter1<<" ";
cout<<endl;
cout<<"\nvec2 vector is a copy of vec1 vector with values greater than 7 removed: ";
for(Iter2 = vec2.begin(); Iter2 != new_end; Iter2++)
cout<<*Iter2<<" ";
cout<<endl;
return 0;
}
Output:
The original vec1 vector data: 0 1 2 3 4 5 6 7 8 9 10 5 5 5
The original vec1 vector data randomly shuffled: 4 10 5 5 0 5 5 1 6 9 3 7 8 2
After the remove_copy_if() operation, the vec1 vector is left unchanged as: 4 10 5 5 0 5 5 1 6 9 3 7 8 2
vec2 vector is a copy of vec1 vector with values greater than 7 removed: 4 5 5 0 5 5 1 6 3 7 2