11.4. Фильтрация значений, выпадающих из заданного диапазона

11.4. Фильтрация значений, выпадающих из заданного диапазона

Проблема

Требуется проигнорировать содержащиеся в последовательности значения, которые располагаются ниже или выше заданного диапазона.

Решение

Используйте функцию remove_copy_if, определенную в <algorithm>, как показано в примере 11.8.

Пример 11.8 Удаление из последовательности элементов, значения которых меньше заданного

#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(10);

 v.push_back(24);

 v.push_back(30);

 remove_copy_if(v.begin(), v.end(),

 ostream_iterator<int>(cout, " "), OutOfRange(10, 25));

}

Программа примера 11.8 выдает следующий результат.

12

18

24

Обсуждение

Функция remove_copy_if копирует элементы из одного контейнера в другой контейнер (или итератор вывода), игнорируя те элементы, которые удовлетворяют предоставленному вами предикату (вероятно, было бы более правильно назвать функцию copy_ignore_if). Однако эта функция не изменяет размер целевого контейнера. Если (как часто бывает) количество скопированных функцией remove_copy_if элементов меньше, чем размер целевого контейнера, вам придется уменьшить целевой контейнер с помощью функции-члена erase.

Для функции remove_copy_if требуется унарный предикат (функтор, который принимает один аргумент и возвращает значение типа boolean), который возвращает значение «истина», когда элемент не должен копироваться. В примере 11.8 предикатом является объект-функция OutOfRange. Конструктор OutOfRange принимает нижнюю и верхнюю границу и перегружает оператор operator(). Функция operator() принимает параметр целого типа и возвращает значение «истина», если переданный аргумент меньше, чем нижняя граница, или больше, чем верхняя граница.