blob: 4ede2f6322d9ac00fe785f8330081b124e97025e [file] [log] [blame]
 remove_copy_if()
Apache C++ Standard Library Reference Guide

remove_copy_if()

Library:  Algorithms

Function

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