## remove_copy_if

    Algorithm

- Summary
- Data Type and Member Function Indexes
- Synopsis
- Description
- Complexity
- Example
- Warnings
- See Also

### Summary

Moves desired elements to the front of a container, and returns an iterator that describes where the sequence of desired elements ends.

### Data Type and Member Function Indexes
(exclusive of constructors and destructors)

None

### Synopsis

    #include <algorithm>
    template <class InputIterator,
              class OutputIterator,
              class Predicate>
     OutputIterator remove_copy_if (InputIterator first,
                                    InputIterator last,
                                    OutputIterator result,
                                    Predicate pred);

### Description

The remove_copy_if algorithm copies all the elements referred to by the iterator `i` in the range `[first, last)` 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 `last1 - first1` applications of the corresponding predicate are done.

### Example

    //
    // remove.cpp
    //
     #include <algorithm>
     #include <vector>
     #include <iterator>
     #include <iostream>
     using namespace std;

     template<class Arg>
     struct all_true : public unary_function<Arg, bool>
     {
       bool operator() (const Arg&) { return 1; }
     };

     int main ()
     {
       int arr[10] = {1,2,3,4,5,6,7,8,9,10};
       vector<int> v(arr+0, arr+10);

       copy(v.begin(),v.end(),
            ostream_iterator<int,char>(cout," "));
       cout << endl << endl;
       //
       // Remove the 7.
       //
       vector<int>::iterator result = remove(v.begin(),
                                      v.end(), 7);
       //
       // Delete dangling elements from the vector.
       //
       v.erase(result, v.end());

       copy(v.begin(),v.end(),
            ostream_iterator<int,char>(cout," "));
       cout << endl << endl;
       //
       // Remove everything beyond the fourth element.
       //
       result = remove_if(v.begin()+4, v.begin()+8,
                all_true<int>());
       //
       // Delete dangling elements.
       //
       v.erase(result, v.end());

       copy(v.begin(),v.end(),
            ostream_iterator<int,char>(cout," "));
       cout << endl << endl;
       //
       // Now remove all 3s on output.
       //
       remove_copy(v.begin(), v.end(),
                   ostream_iterator<int>(cout," "), 3);
       cout << endl << endl;
       //
       // Now remove everything satisfying predicate on output.
       // Should yield a NULL vector.
       //
       remove_copy_if(v.begin(), v.end(),
                      ostream_iterator<int,char>(cout," "),
                      all_true<int>());

       return 0;
     }

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

### Warnings

If your compiler does not support default template parameters, then you always need to supply the `Allocator` template argument. For instance, you need to write:

`vector<int, allocator<int> >`

instead of:

`vector<int>`

If your compiler does not support namespaces, then you do not need the using declaration for `std`.

### See Also

remove, remove_if, remove_copy

Copyright (c) 1998, Rogue Wave Software, Inc.
Send mail to report errors or comment on the documentation.
OEM Release, June 1998