|
Программирование >> Операторы преобразования типа
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.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |