На этом шаге мы рассмотрим особенности задания множеств по маске.
Следующий способ позволяет определять подмножества элементов по маске - логическому выражению. Например, рассмотрим следующее выражение:
va[va > 7]
В этом выражении показанное ниже подвыражение возвращает массив размера va, в котором для каждого элемента логический признак
указывает, превышает ли этот элемент 7:
va > 7
Оператор индексирования при помощи этого логического массива определяет все элементы, для которых логическое выражение возвращает true.
Таким образом, следующая конструкция определяет подмножество элементов массива va, больших 7.
va[va > 7]
В остальном маскированные массивы ничем не отличаются от других подмножеств.
- Чтобы определить подмножество элементов массива значений, вы просто передаете массив логических значений в аргументе оператора []
массива значений. - Если массив значений является константным, то полученное выражение определяет новый массив значений.
- Для неконстантных массивов значений полученное выражение определяет объект mask_array, представляющий набор элементов массива
значений со ссылочной семантикой:namespace std { template <class T> class mask_array; template <class T> class valarray { public: // Маскирование константного массива значений // возвращает новый массив значений valarray<T> operator[] (const gslice&) const; // Маскирование неконстантного массива // значений возвращает mask_array mask_array<T> operator[] (const valarray<bool>&); ... }; }
- Для класса mask_array определены операторы присваивания (обычные и комбинированные), позволяющие модифицировать элементы подмножества.
- Преобразования типа позволяют объединять маскированные массивы с другими массивами значений и подмножествами их элементов (смотри 433 шаг).
На следующем шаге мы рассмотрим пример использования маскировааного множества.