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