Library: Algorithms
Function
Algorithm that copies all elements other than those that satisfy a given predicate from one range to another
#include <algorithm>
namespace std {
template <class InputIterator,
class OutputIterator,
class Predicate>
OutputIterator remove_copy_if(InputIterator start,
InputIterator finish,
OutputIterator result,
Predicate pred);
}
The remove_copy_if() algorithm copies all the elements referred to by the iterator i in the range [start, finish) for which the following condition does not hold: pred(*i) == true. remove_copy_if() returns an iterator that points to the end of the resulting range. remove_copy_if() is stable, which means that the relative order of the elements in the resulting range is the same as their relative order in the original range.
Exactly finish - start applications of the corresponding predicate are done.
//
// remove.cpp
//
#include <algorithm> // for copy, remove, remove_copy, remove_if
#include <functional> // for unary_function
#include <iostream> // for cout, endl
#include <iterator> // for ostream_iterator
#include <vector> // for vector
template<class Arg>
struct not_zero: public std::unary_function<Arg, bool>
{
bool operator() (const Arg &a) const {
return a != 0;
}
};
int main ()
{
// For convenience.
typedef std::vector<int, std::allocator<int> > Vector;
typedef std::ostream_iterator<int, char,
std::char_traits<char> >
Iter;
// Populate a vector with elements from an array.
const Vector::value_type arr[] = { 1, 2, 3, 4, 5,
6, 7, 8, 9, 10};
Vector v (arr + 0, arr + sizeof arr / sizeof *arr);
// Write out the contents to cout.
std::copy (v.begin (), v.end (), Iter (std::cout," "));
std::cout << std::endl << std::endl;
// Move the 7 to the end of the vector.
Vector::iterator result = std::remove (v.begin (),
v.end (), 7);
// Delete the 7 from the vector.
v.erase (result, v.end ());
std::copy (v.begin (), v.end (), Iter (std::cout, " "));
std::cout << std::endl << std::endl;
// Remove all non-zero elements beyond the fourth element.
v.erase (std::remove_if (v.begin () + 4, v.end (),
not_zero<int> ()), v.end ());
std::copy (v.begin (), v.end (), Iter (std::cout, " "));
std::cout << std::endl << std::endl;
// Now remove all 3s on output.
std::remove_copy (v.begin (), v.end (),
Iter (std::cout, " "), 3);
std::cout << std::endl << std::endl;
// Now remove everything satisfying predicate on output.
std::remove_copy_if (v.begin (), v.end (),
Iter (std::cout, " "),
not_zero<int>());
// Return 0 on success, a non-zero value on failure
return !!v.empty ();
}
Program Output:
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 8 9 10 1 2 3 4 1 2 4
remove(), remove_if(), remove_copy()
ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 25.2.7