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

1 ... 167 168 169 [ 170 ] 171 172 173 ... 239


Создание массивов значений

при создании массива значений количество элементов обычно передается в параметре конструктора:

std::valarray<1nt> val(10): Массив из десяти нулевых элементов 1nt std::valarray<float> val2(5.7.10): Массив из десяти элементов float.

равных 5.7 (обратите внимание

на порядок!)

Если конструктор вызывается с одним аргументом, передаваемое значение интерпретируется как размер массива. Элементы инициализируются конструктором по умолчанию для типа элемента; базовые типы инициализируются нулями (инициализация базовых типов констрзтором по зпюлчанию рассматривается на с. 30). Если при вызове конструктора передаются два аргумента, то первый определяет нача.яьное значение, а второй - количество элементов. Такой порядок передачи двух аргументов конструктору отличается от остальных классов стандартной библиотеки С++. Во всех контейнерах STL первый числовой аргумент определяет количество элементов, а второй - их исходное значение.

Массив значений также можно инициализировать обычным массивом; 1nt аггау[] = { 3, 6. 18. 3. 22 }:

Инициализация массива значений элементами обычного массива: std::valarray<int> va3(array.sizeof(array)/sl2eof(array[0])):

Инициализация элементами массива со второго по четвертый std::valarray<int> va4(array+1.3):

Массив значений создает копии передаваемых данных, поэтому для инициализации могут использоваться временные данные.

Операции с массивами значений

В массивах значений для обращения к элементам определен оператор индексирования []. Как обычно, первому элементу соответствует индекс 0:

va[0] = 3 * va[l] + va[2]:

Также для массивов значений определяются все обычные математические операторы (сложение, вычитание, умножение, деление с остатком, изменение знака, поразрядные операторы, операторы сравнения и логические операторы, а также полный набор операторов присваивания). Эти операторы вызываются для каждого элемента массива значений, обрабатываемого в ходе операции. Таким образом, результат операции с массивом значений представ.яяет собой массив значений, размер которого соответствует размеру операндов; этот массив значений содержит результат поэлементных вычислений. Например, рассмотрим следующую команду:

val = va2 * va3:



Эта команда эквивалентна последовательности команд:

valLOJ - va2[0] * va3[0] val[l] - va2[l] * va3[l] val[2] = va2[2] * va3[2]

Если количество элементов в массивах-операндах различно, результат операции не определен.

Конечно, выполнение операций возможно только в том случае, если они поддерживаются типом элементов, а конкретный смысл операции зависит от смысла операции для элементов. Иначе говоря, любая операция с массивом значений сводится к выполнению одинаковых операций с каждым элементом или парой элементов массивов-операндов.

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

val - 4 * va2;

Эта команда эквивалентна последовательности команд:

val[0] = 4 * va2[0] val[l] = 4 * va2[l] val[2] =4* va2[2]

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

std:;valarray<double> va(20):

va = 4 * va; ОШИБКА: несоответствие типов

Правила бинарных операций также распространяются на операторы сравнения. Оператор =~ не возвращает одну логическую величину - признак равенства массивов. Вместо этого он возвращает новый массив значений того же размера, содержащий элементы типа bool; каждый элемент содержит результат сравнения соответствующей пары элементов. Например, рассмотрим следзто-щий фрагмент:

std::valarray<double> vaUlO) std::valarray<double> va2(10) std::valarray<double> vab(lO)

vab = (val == va2);



В этом фрагменте последняя команда эквивалентна последовательности ко-

манд:

vab[0]

= (valLO]

== va2[0])

vab[l]

= (valLU

== va2[l])

vab[2]

= (val[2]

== va2[2])

vab[9]

- (val[9]

va2[9])

По этой причине массивы значений не могут сортироваться оператором < и не могут использоваться в качестве элементов контейнеров STL, если проверка их на равенство выполняется оператором == (требования к элементам контейнеров STL изложены на с. 143).

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

num/vall.cpp #1nclude <1ostrearTP* #1nclude <valarray> using namespace std;

Вывод массива значений template <class J>

void prlntValarray (const valarray<T>& va) {

for (lnt 1=0: 1<va,s1ze(); 1++) { cout va[1] ;

cout endl;

int mainO {

Определение двух массивов с десятью элементами valdrray<double> val(lO). va2(10):

Заполнение первого массива эначениями 0.0. 1.1 .,. 9.9 for (int 1=0; i<lO; i++) { val[i] = 1 * 1.1;

Присваивание -1 всем элементам второго массива значений va2 = -1;

Вывод обоих массивов значений

prlntValarray(val):

pr1ntValarray(va2):

, Вывод минимума, максимума и суммы элементов для первого массива cout m1n(): val.minO endl;



1 ... 167 168 169 [ 170 ] 171 172 173 ... 239

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