Apache C++ Standard Library Reference Guide

## remove_copy_if()

Library:  Algorithms

`Function`

No Entries

### Summary

Algorithm that copies all elements other than those that satisfy a given predicate from one range to another

### Synopsis

```#include <algorithm>

namespace std {
template <class InputIterator,
class OutputIterator,
class Predicate>
OutputIterator remove_copy_if(InputIterator start,
InputIterator finish,
OutputIterator result,
Predicate pred);
}
```

### Description

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.

### Complexity

Exactly finish - start applications of the corresponding predicate are done.

### Example

```//
//  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

```