Эта тема небольшое отвлечение от предыдущих тем сайта. Здесь только пример использования пары генерирующих алгоримов. Генерирующие STL-алгоритмы — это такие, которые умеют создавать последовательность и на основании каких-то данных её заполнять. Так, например, работают copy_if (копируют в новую последовательность такие значения, которые удовлетворяют заданному условию), generate (заполняет последовательность генерируемыми значениями). Эти два алгоритма и будут использованы для решения одной не сложной задачи.
Задан двумерный массив. Нужно заполнить этот двумерный массив случайными числами. После заполнения сформировать одномерный массив так, чтобы он содержал только все отрицательные числа из двумерного массива.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//C++ Листинг #1
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
usingnamespacestd;
intpred(){
returnrand()%20-10;//Задаем диапазон случайных чисел
/*СОЗДАНИЕ ОДНОМЕРНОГО ИЗ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ ДВУМЕРНОГО*/
intX[N*M]={0};
copy_if(&Arr[0][0], &Arr[0][0]+N*N, X ,[](int x){
return x < 0;
});
/*ВЫВОД ОДНОМЕРНОГО МАССИВА НА ЭКРАН*/
cout<<"\n";
for(inti=0;i<N*M;i++){
if(X[i]==0){
break;
}
cout<<X[i]<<"\t";
}
}
pred в этом коде — это специальная функция, которую принимает алгоритм. Для нас это обычная функция, но для алгоритма generate она определяющая повдение. Обратите внимание, что в алгоритме используется имя функции, а не вызов (нет круглых скобок). Генератор псевдослучайных значений, описанный в предикате, надеюсь, объяснять не нужно. Функция pred (она же предикат) возвращает случайное число из заданного для rand диапазона, и это число алгоритм generate записывает в ячейку формируемого массива. Вот и вся премудрость. У двумерного массива берется два адреса: адрес начала и адрес последнего элемента. Используемый синтаксис, может быть, кому-то и покажется интересным, но он затрудняет читаемость кода, а это плохо. Так как работа именно с обычными массивами, то такой уж синтаксис подходит для решения.
Следующий шаг — заполнение одномерного массива отрицательными числами. Если есть какое-то условие и по условию надо скопировать некоторые значения в другой контейнер, то с большой вероятностью для решения подходит алгоритм copy_if, внутри которого указываются адреса начала и конца обрабатываемого диапазона, начало контейнера, в который будет вставлено значение, выполняющее условие, и предикат (специальная функция, определяющая подходит ли значение под условие)
В #2 на месте предиката используется лямбда-выражение (C++11).
Добавить комментарий