3. Еще один конструктор объектов функций с именем clampval
max
и min
и вызывает функцию std::clamp
, чтобы поместить получаемые значения в заданный диапазон:static auto clampval (int min, int max)
{
return [=] (int val) -> int {
return clamp(val, min, max);
};
}
4. Данные, которые мы будем нормализовывать, представляют собой вектор, содержащий разнообразные значения. Они могут быть, например, данными о температуре, высоте ландшафта или стоимости акций, изменяющимися с течением времени:
int main()
{
vector
5. Чтобы нормализовать эти данные, нужно иметь
std::minmax_element
. Она возвращает пару итераторов, указывающих именно на эти два значения: const auto [min_it, max_it] (
minmax_element(begin(v), end(v)));
6. Скопируем все значения из первого вектора во второй. Создадим экземпляр второго вектора и подготовим его к тому, чтобы он принял столько новых элементов, сколько содержится в первом векторе:
vector
v_norm.reserve(v.size());
7. С помощью функции std::transform
0
и 1000
. Минимальное и максимальное значения после нормализации равны 0
и 255
: transform(begin(v), end(v), back_inserter(v_norm),
norm(*min_it, *max_it, 255));
8. Прежде чем реализовать вторую стратегию по нормализации, выведем полученный результат:
copy(begin(v_norm), end(v_norm),
ostream_iterator
cout << '\n';
9. Снова используем тот же нормализованный вектор, чтобы продемонстрировать работу другой вспомогательной функции clampval
0
, а максимальное — 255
: transform(begin(v), end(v), begin(v_norm),
clampval(0, 255));
10. После вывода этих значений на экран пример будет закончен:
copy(begin(v_norm), end(v_norm),
ostream_iterator
cout << '\n';
}
11. Скомпилируем и запустим программу. Поскольку значения элементов диапазона теперь попадают в диапазон от 0
255
, можно использовать их, например, как показатели яркости для цветовых кодов RGB:$ ./reducing_range_in_vector
0, 255, 1, 63, 76, 204, 229, 81,
0, 255, 5, 250, 255, 255, 255, 255,
12. На основе полученных данных можно построить следующие графики (рис. 5.2). Как видите, подход, когда мы
Как это работает
Помимо std::transform
std::minmax_element
Функция std::clamp
max(min_val, min(max_val, x))
вместо std::clamp(x, min_val, max_val)
. Находим шаблоны в строках с помощью функции std::search и выбираем оптимальную реализацию
Поиск строки — несколько иная задача, нежели поиск