Filtering Values Outside a Given Range

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



C++ Cookbook
Secure Programming Cookbook for C and C++: Recipes for Cryptography, Authentication, Input Validation & More
ISBN: 0596003943
EAN: 2147483647
Year: 2006
Pages: 241

Flylib.com © 2008-2020.
If you may any questions please contact us: flylib@qtcs.net