Apache C++ Standard Library Reference Guide

## remove_copy_if()

Library: Algorithms

    Function

- Local Index
- Summary
- Synopsis
- Description
- Complexity
- Example
- See Also
- Standards Conformance

### Local Index

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

### See Also

`remove()`, `remove_if()`, `remove_copy()`

### Standards Conformance

ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 25.2.7