Маски — это самые настоящие логические выражения, если для данного элемента массива значений условие в индексе истинное, значит элемент попадет в подмножество. Вот простой пример маски:
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.