STL Использование алгоритмов на массивах (С++ 11)

STL Использование алгоритмов на массивах (С++ 11)
Пример решения несложной задачи с использованием алгоритмов из STL

Если без C++ 11, то нужно из лямбда выражения [](){} сделать предикатную функцию.

  • Задан двумерный массив. Нужно заполнить этот двумерный массив случайными числами. После заполнения сформировать одномерный массив, который содержит все отрицательные числа из двумерного массива.

Сама по себе задача несложная, но я ее немного осложню. Смысл в том, что заполнять двумерный массив надо алгоритмом и формировать одномерный массив тоже надо алгоритмом. При этом использовать надо обычные массивы, а не вектора (не контейнеры STL).

Зачем я это показал? Просто этот пример хорошо демонстрирует, что STL прекрасно работает не только с контейнерами STL, но и, например, с самыми обычными массивами.

pred в этом коде — Это специальная функция, которую принимает алгоритм. Для нас — это обычная функция, но для алгоритма generate — это специальная функция, которая определяет поведение алгоритма. Называются такие функции предикатами. Обратите внимание, что в алгоритме у предиката не указаны скобки, как обычно указывают у функций. Генератор псевдослучайных значений, описанный в предикате, надеюсь, объяснять не нужно. Предикат возвращает случайное число из выбираемого диапазона, и это число алгоритм generate записывает в ячейку массива. Вот и вся премудрость. У двумерного массива берутся адрес начал и адрес его последнего элемента, этот синтаксис, может быть, кому-то и покажется интересным, но он затрудняет читаемость кода, а это плохо. Так как работа именно с обычными массивами, то такой синтаксис подходит для решения.

Следующий шаг — заполнение одномерного массива отрицательными числами. Если есть какое-то условие и по условию надо скопировать некоторые значения в другой контейнер, то с большой вероятностью для решения подходит алгоритм copy_if, внутри которого указываются адреса начала и конца обрабатываемого диапазона, начало контейнера, в который будет вставлено значение, выполняющее условие и предикат (специальная функция, определяющая подходит ли значение под условие)

В этом примере на месте предиката используется лямбда выражение.

Здесь x — это каждое значение из указанного алгоритму для обработки диапазона (не то, куда вставлять, а то, какой обрабатывать).
Выражение

В более полном варианте выглядит как

Если неудобно использовать как в примере, то на первых порах сойдет и более раскрытый вариант. Просто этот прием укорачивает код и вы все равно к нему придете.

При использовании алгоритмов на обычных массивах не всегда все будет гладко. Иногда может не компилироваться код (у меня часто при разных экспериментах такое случается), но тем не менее, по этому примеру должно быть понятно, что алгоритмы хорошо работают не только с контейнерами из STL, но и c другими тоже.

Вот, постарался подробно расписать использование алгоритмов на обычных массивах. Надеюсь было кому-нибудь полезно.

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

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

Ваш e-mail не будет опубликован.

Поиск

 
     

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

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

В свои 20 лет он знал более 9 опеpационных систем и ни одной женщины.

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок