Problem
You want to ignore values from a sequence that fall above or below a given range.
Solution
Use the remove_copy_if function found in the , as shown in Example 11-8.
Example 11-8. Removing elements from a sequence below a value
#include #include #include #include using namespace std; struct OutOfRange { OutOfRange(int min, int max) : min_(min), max_(max) { } bool operator( )(int x) { return (x < min_) || (x > max_); } int min_; int max_; }; int main( ) { vector v; v.push_back(6); v.push_back(12); v.push_back(18); v.push_back(24); v.push_back(30); remove_copy_if(v.begin( ), v.end( ), ostream_iterator(cout, " "), OutOfRange(10,25)); }
The program in Example 11-8 produces the following output:
12 18 24
Discussion
The remove_copy_if function copies the elements from one container to another container (or output iterator), ignoring any elements that satisfy a predicate that you provide (it probably would have been more accurate if the function was named copy_ignore_if). The function, however, does not change the size of the target container. If, as is often the case, the number of elements copied by remove_copy_if is fewer than the size of the target container, you will have to shrink the target container by calling the erase member function.
The function remove_copy_if requires a unary predicate (a functor that takes one argument and returns a boolean value) that returns true when an element should not be copied. In Example 11-8 the predicate is the function object OutOfRange. The OutOfRange constructor takes a lower and upper range, and overloads operator( ). The operator( ) function takes an integer parameter, and returns true if the passed argument is less than the lower limit, or greater than the upper limit.
Building C++ Applications
Code Organization
Numbers
Strings and Text
Dates and Times
Managing Data with Containers
Algorithms
Classes
Exceptions and Safety
Streams and Files
Science and Mathematics
Multithreading
Internationalization
XML
Miscellaneous
Index