|
Программирование >> Операторы преобразования типа
cout шахО: val.inaxO endl; cout sumO: val.sumO endl; Присваивание содержимого первого массива второму va2 = val; Удаление всех элементов первого массива val.reslze(O); Повторный вывод обоих массивов значений printValarray(val); printValarray(va2); Результат выполнения программы выглядит так: О 1.1 2.2 3,3 4.4 5.5 6.6 7.7 8.8 9.9 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 minO шахО sumO 9.9 49.5 Трансцендентные функции Трансдеидентные функции (тригонометрические и экспоненциальные) определяются по аналогии с математическими операторами. Соответствующая операция также выполняется со всеми элементами массива. Для бинарных операций один операнд может быть отдельным значением, а второй операнд - содержать все элементы массива значений. Все эти операции определяются в виде глобальных функций (а не в виде функций класса). Это сделано для того, чтобы обеспечить автоматическое преобразование типов подмножеств э.яементов для обоих операндов (подмножества массивов значений рассматриваются на с. 531). Второй пример с массивами значений демонстрирует использование трансцендентных операций: num/val2.cpp #1nclude <iostream> finclude <valarray> using namespace std: Вывод массива значений template <class T> void printValarray (const valarray<T>& va) i for (int 1=0; i<va.SizeO; i++) { cout va[i] ; cout endl: 1nt rna1n() { Создание и инициализация массивов значений с девятью элементами valarray<double> va(9); for (1nt 1=0: 1<va.SizeO: 1++) { va[1] = 1 * 1.1: Вывод массива значений prlntValarray(va): Удвоение элементов массива va *= 2.0; Повторный вывод массива значений prIntValarrayCva): Создание второго массива значений, инициализированного элементами первого массива, увеличенными на 10 valarray<double> vb(va+10.0): Вывод второго массива значений prlntValarray(vb): Создание третьего массива значений и его инициализация результатом выполнения операций с обоими существующими массивами valarray<double> vc; vc = sqrt(va) + vb/2.0 - 1.0: Вывод третьего массива значений printValarray(vc); Результат выполнения программы выглядит так: О 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.В О 2.2 4.4 6.6 8.8 11 13.2 15.4 17.6 10 12.2 14.4 16.6 18.8 21 23.2 25.4 27.6 4 6,5В324 8.29762 9.86905 11.2665 12.8166 14.2332 15,6243 16.9952 Подмножества элементов в массивах значений Оператор индексирования [] перегружается для специальных вспомогательных объектов, различными способами определяющих подмножества элементов. Перегрузка обеспечивает элегантный механизм выполнения операций с частью элементов массива (с доступом как для чтения, так и для записи). Чтобы определить подмножество массива значений, достаточно указать вместо индекса соответствующее определение, например: va[std::slice(2.4,3)] Четыре элемента на расстоянии 3. начиная с индекса 2 va[va>7] Все злененты со значением, большим 7 Если определение подмножества (такое, как std::slice(2,4,3) или va>7) используется с константным массивом значений, то выражение возвращает новый массив значений с соответствующими элементами. Но если определение подмножества используется с неконстантным массивом значений, то выражение возвращает временный объект специального вспомогательного класса. Временный объект содержит не данные подмножества, а только его определение. Обработка выражений откладывается до того момента, когда для получения окончательного результата потребуются данные. Подобный механизм называется отложенным вычислением.. Отказ от вычисления временных данных экономит время и память. Кроме того, отложенные вычисления обеспечивают ссылочную семантику, то есть подмножество пред-став.яяет собой логический набор ссылок на исходные данные. Это позволяет использовать его в качестве приемника команды (1-значения). Например, подмножеству массива значений можно присвоить результат умножения двух других подмножеств того же массива (примеры приводятся далее). С другой стороны, отложенные вычисления могут дать неожиданные результаты в ситуациях, когда элементы приемного множества также присутствуют в исходном множестве. По этой причине любые операции с массивами значений гарантированно работают только в том случае, если исходное и приемное множества не имеют общих элементов. Хорошо продуманное определение подмножеств позволяет наделить массивы значений семантикой двух и более измерений. Это означает, что массивы значений могут использоваться в качестве многомерных массивов. Существуют четыре варианта определения подмножеств в массивах значений: О срезы; О обобщенные срезы; О отбор по логическому признаку; О перечисляемые подмножества. Ниже мы рассмотрим все четыре способа с конкретными примерами. Проблемы с подмножествами элементов массивов значений Прежде чем переходить к рассмотрению вариантов определения подмножеств, следует упомянуть одну общую проблему. Работа с подмножествами элементов в массивах значений организована недостаточно хорошо. Вы легко можете создавать подмножества, но при их использовании вместе с другими подмножествами возникают трудности. К сожалению, практически всегда приходится выполнять явное преобразование типа к valarray. Дело в том, что в стандартной библиотеке С++ не указано, что подмножества поддерживают те же операции, что и массивы значений. Предположим, нужно вычислить произведение двух подмножеств и присвоить результат третьему подмножеству. Следующее решение не подходит: ОШИБКА: отсутствуют преобразования типов va[std;:slice(0,4.3)] = va[std::slice(1.4,3)] * va[std::sl1ce(2,4.3)]:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |