11.4. 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
<algorithm>
, as shown in Example 11-8.
Example 11-8. Removing elements from a sequence below a value
#include <algorithm> #include <vector> #include <iostream> #include <iterator> 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<int> 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<int>(cout, "\n"), 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 ...
Get C++ Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.