Программирование >>  Операторы преобразования типа 

1 ... 171 172 173 [ 174 ] 175 176 177 ... 239


32 35 38 41 42 45 4В 51

62 65 68 71 72 75 78 81

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

О Чтобы определить подмножество элементов массива значений, достаточно передать обобшенный срез в аргументе оператора [].

О Для константных массивов значений результат представляет собой новый массив значений.

О Для неконстантных массивов значений итоговое выражение представляет собой объект gslice array, представляюший набор э.яементов массива значений со ссылочной семантикой:

namespace std { class gslice;

template <class T> class gslice array:

template <class T> class valarray { public:

Обобщенный срез константного массива значений возвращает новый массив значений valarray<T> operator[] (const gsl1ce&) const;

Обобщенный срез неконстантного массива значений возвращает gsl1ce array gsl1ce array<T> operator[] (const gsl1ce&):

О Для класса gslice array определены операторы присваивания (обычные и комбинированные), позволяющие модифицировать элементы подмножества.

О Преобразования типа позволяют объединять обобщенные срезы с другими массивами значений и подмножествами их элементов (см. с. 532).

Следующая программа демонстрирует работу со срезами массивов значений:

num/gsHcel.cpp #1nclude <1ostream> #1nclude <valarray> using namespace std:

Построчный вывод трехмерного массива значений template<class Т>



void pr1ntValarray3D (const valarray<T>& va. Int diml, Int d1m2; I

for (1nt 1=0: i<va.size()/(d1fTil*d1[n2); ++1) { for (Int j=0: j<dirn2; { for (Int k=0: k<d1iiil: ++k) {

cout va[1*d1ml*d1rn2+j*d1fTil+k] :

cout \n:

cout \n:

cout endl;

Int maInO

/* Массив значений из 24 злементов

* - две группы

* - четыре строки

* - три столбца */

valarray<double> va(24);

Заполнение массива значений данными for (Int i=0: 1<24: ( va[1] = 1:

Вывод массива значений printValarray3D (va. 3. 4):

Нам нужны два двумерных подмножества 3x3 элемента в двух 12-злементных массивах s1ze t lengthvalues[] = { 2. 3 }; s1ze t str1devalues[] = { 12. 3 j: valarray<size t> lengthdengthvalues .2): valarray<s1ze t> str1de(str1devalues.2):

Присвоить второй столбец первых трех строк первому столбцу первых трех строк va[gsl1ce(0.length.stride)]

= valarray<double>(va[gslIced.length.stride)]):

Прибавить и присвоить третью из первых трех строк первой из первых трех строк va[gsl1ce(0.length,stride)]

+= valarray<double>(va[gsl1ce(2,length,stride)]);

Вывод массива значений pr1ntValarray3D (va. 3. 4):



Результат выполнения программы выглядит так:

О 1 2 3 4 5 6 7 а 9 10 11

12 13 14 15 16 17 18 19 20 21 22 23

3 1 2 9 4 5 15 7 8 9 10 11

27 13 14 33 16 17 39 19 20 21 22 23

Определение подмножеств по маске

Следующий способ позволяет определять подмножества элементов по маске - логическому выражению. Например, рассмотрим следующее выражение:

va[va > 7]

В этом выражении показанное ниже подвыражение возвращает массив размера va, в котором для каждого элемента логический признак указывает, превышает ли этот элемент 7:

va > 7

Оператор индексирования при помопш этого логического массива определяет все элементы, для которых логическое выражение возвращает true. Таким образом, следующая конструкция определяет подмножество элементов массива va, больших 7.

va[va > 7]

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

О Чтобы определить подмножество элементов массива значений, вы просто передаете массив логических значений в аргументе оператора [] массива значений.

О Если массив значений является константным, то полученное выражение определяет новый массив значений.

О Для неконстантных массивов значений полученное выражение определяет объект mask array, представляющий набор элементов массива значений со ссылочной семантикой:

namespace std {

template <class Т> class mask array.



1 ... 171 172 173 [ 174 ] 175 176 177 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика