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