Маски — это самые настоящие логические выражения, если для данного элемента массива значений условие в индексе истинное, значит элемент попадет в подмножество. Вот простой пример маски:
array[array!= 0] = 0;
В этом примере array
— это массив значений, в индексе которого указана маска != 0
. То есть для каждого элемента массива значений не равного нулю присваивается нуль. Все очень просто и понятно. В качестве маски может быть указано любое логическое выражение, что очень удобно, если необходимо использовать составное условие. Давайте рассмотрим простой пример программы с использованием маски в для выделения подмножества:
#include <iostream> #include <valarray> // заголовочный файл массивов значений #include <cstdlib> using namespace std; int main() { srand(time(NULL)); valarray<int> array(0, 15); cout << "Исходный масссив: "; for(int i = 0; i < array.size(); i++) { array[i] = rand() % 10; cout << array[i] << " "; } array[array> 5 && array < 8] = -1; // по маске присваиваем значение -1 cout << "\nИзмененный массив значений: "; for(int i = 0; i < array.size(); i++) { cout << array[i] << " "; } return 0; }
В программе, в строке 17 в индексе массива значений array указана маска — array> 5 && array < 8
по которой выполняется выборка значений массива и этим значениям присваивается -1
. То есть значением -1
присваивается всем тем элементам массива значений, которые больше пяти, но и не больше 8. Это хорошо видно в результате работы программы:
Исходный массив: 2 6 4 6 5 4 8 2 6 4 8 1 4 5 4 Измененный массив значений: 2 -1 4 -1 5 4 8 2 -1 4 8 1 4 5 4
По маскам — все. Это не сложная тема, все свои вопросы задавайте на нашем форуме или в комментариях, ниже.
Перечисляемые подмножествами
Итак, что же такое перечисляемые подмножества? Собственно, ответ на этот вопрос лежит в самом названии, то есть, это список каких-то элементов из основного множества. Задается такой список как массив, элементами которого являются индексы элементов основного множества. Чтобы понять как это работает, давайте рассмотрим следующий пример программы:
#include <iostream> #include <valarray> // заголовочный файл массивов значений #include <cstdlib> using namespace std; int main() { srand(time(NULL)); valarray<int> array(0, 15); cout << "Исходный масссив: "; for(int i = 0; i < array.size(); i++) { array[i] = rand() % 10; cout << array[i] << " "; } //определяем подмножество (тип данных для подмножества обязательно должен быть size_t) valarray<size_t> index(5); index[0] = 7; index[1] = 12; index[2] = 14; index[3] = 2; index[4] = 0; valarray<int> array2(array[index]); // присвоили значения подмножества другому массиву значений cout << "\nЗначения подмножества: "; for(int i = 0; i < array2.size(); i++) { cout << array2[i] << " "; } array[index] = 99; // всем элементам подмножества присвоили значение 99 cout << "\nИзмененный массив значений: "; for(int i = 0; i < array.size(); i++) { cout << array[i] << " "; } return 0; }
Как всегда, начало программы одинаковое. Начнем со строк 18 -23, мы объявили перечисляемое подмножество. Запомните, что тип данных у перечисляемого подмножества должен быть size_t
. Это подмножество состоит из пяти элементов, каждый из элементов подмножества содержит целое положительное число — это индекс элемента из основного множества. В нашем примере указаны индексы 7
, 12
, 14
, 2
и 0
. То есть в это подмножество будут входить следующие элементы из главного множества: восьмой, тринадцатый, пятнадцатый, третий и первый. Мы можем например используя это подмножество, присвоить элементы подмножества другому массиву значений, это сделано в строке 25. Кроме того, каждому значению подмножества можно присвоить одинаковое значение всего одной простой строкой, как показано в строке 31. Все эти изменения хорошо видны в результате работы программы:
Исходный массив: 2 9 4 3 7 1 8 3 6 3 1 4 5 1 7 Значения подмножества: 3 5 7 4 2 Измененный массив значений: 99 9 99 3 7 1 8 99 6 3 1 4 99 1 99
Из вывода программы видно, какие значения выделены в подмножество, кроме этого, всем значениям подмножества было присвоено число 99
.