С++. Небольшое отвлечение. Пример использования генерирующих алгоритмов на двумерном массиве

Эта тема небольшое отвлечение от предыдущих тем сайта. Здесь только пример использования пары генерирующих алгоримов. Генерирующие STL-алгоритмы — это такие, которые умеют создавать последовательность и на основании каких-то данных её заполнять. Так, например, работают copy_if (копируют в новую последовательность такие значения, которые удовлетворяют заданному условию), generate (заполняет последовательность генерируемыми значениями). Эти два алгоритма и будут использованы для решения одной не сложной задачи.
  • Задан двумерный массив. Нужно заполнить этот двумерный массив случайными числами. После заполнения сформировать одномерный массив так, чтобы он содержал только все отрицательные числа из двумерного массива.
pred в этом коде — это специальная функция, которую принимает алгоритм. Для нас это обычная функция, но для алгоритма generate она определяющая повдение. Обратите внимание, что в алгоритме используется имя функции, а не вызов (нет круглых скобок). Генератор псевдослучайных значений, описанный в предикате, надеюсь, объяснять не нужно. Функция pred (она же предикат) возвращает случайное число из заданного для rand диапазона, и это число алгоритм generate записывает в ячейку формируемого массива. Вот и вся премудрость. У двумерного массива берется два адреса: адрес начала и адрес последнего элемента. Используемый синтаксис, может быть, кому-то и покажется интересным, но он затрудняет читаемость кода, а это плохо. Так как работа именно с обычными массивами, то такой уж синтаксис подходит для решения.
Следующий шаг — заполнение одномерного массива отрицательными числами. Если есть какое-то условие и по условию надо скопировать некоторые значения в другой контейнер, то с большой вероятностью для решения подходит алгоритм copy_if, внутри которого указываются адреса начала и конца обрабатываемого диапазона, начало контейнера, в который будет вставлено значение, выполняющее условие, и предикат (специальная функция, определяющая подходит ли значение под условие)
В #2 на месте предиката используется лямбда-выражение (C++11).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/duglas-krokford/javascript-silnye-storony/?lfrom=15589587
Яндекс.Метрика