Анимация
JavaScript
|
Главная Библионтека О Разрывы направлены вдоль отрицательной вещественной полуоси. complex sin (const complex cwplx) complex cos (const complex cmplx) complex tan (const complex, cmplx) complex sinh (const complex cmplx) complex cosh (const conplexh cmplx) complex tanh (const complex cmplx) О Функции возвращают результаты соответствующих комплексных тригонометрических операций с cmplx. Массивы значений В стандартную библиотеку С++ входит класс valarray, предназначенный для обработки массивов числовых значений. Массив значений представляет математическую концепцию линейной последовательности значений. Он имеет всего одно измерение, но специальные правила вычисления индексов и мощные средства выделения подмножеств позволяют имитировать большую размерность. Таким образом, массив значений может использоваться в качестве эффективной базы для операций с векторами и матрицами, а также для обработки математических систем полиномиальных уравнений. Нетривиальные оптимизации в классах массивов значений обеспечивают хорошее быстродействие при обработке данных. Впрочем, сейчас еще нельзя сказать, насколько важным этот компонент стандартной библиотеки С++ останется в будущем, потому что сзоцествуют дрзчпе интересные разработки, которые показывают еще лучшие результаты. Один из самых интересных примеров - система Blitz. Если вы щггересуетесь обработкой числовых данных, обязательно познакомьтесь с ней. За подробностями обращайтесь по адресу http: monet.uwater1oo.ca/blitz/. Качество проектирования классов массивов значений оставляет желать лучшего. В сущности, никто даже не пытался проверить работоспособность итоговой спецификации, поскольку никто не «чзшствовал себя ответственным» за эти классы. Люди, включившие массивы значений в стандартную библиотеку С++, покинули комитет по стандартизации задолго до написания стандарта. Например, для работы с массивами значений часто требуются неудобные и долгие преобразования типов (см. с. 532). Знакомство с массивами значений Массив значений представляет собой одномерный массив с последовательной нумерацией элементов, начиная с 0. Массивы значений предоставляют средства для выполнения вычислений со всеми элементами (или с их подмножеством) одного или нескольких массивов значений. Например, в следующей команде а, Ь, с, X и Z могут быть массивами, содержащими сотни числовых значений: 2 = а*х*х + Ь*х + с К преимуществам такого синтаксиса следует отнести простоту записи. Кроме того, массивы значений обеспечивают хорошую эффективность обработки данных благодаря оптимизациям, предотвращающим создание временных объектов во время выполнения команды. Специальные интерфейсы и вспомогательные классы предоставляют средства для ограничения обработки подмножеством элементов массива значений и для имитации многомерных массивов. В этом отношении массивы значений также упрощают реализацию классов векторов и матриц. Стандарт гарантирует, что доступ к массивам значений является безальтернативным. Другими словами, обращение к любому значению неконстантного массива значений производится по уникальному пути. Такие гарантии помогают оптимизировать операции с массивами, поскольку компилятору не приходится учитывать возможность обращения к данным по другому пути. Заголовочный файл Массивы значений объявляются в заголовочном файле <valarray>: linclude <valarray> В частности, <valarray> содержит объявления следующих классов: namespace std { template<class Т> class valarray: Числовой массив типа Т class slice: Срез массива значений template<class Т> class slice array: class gslice: Обобщенный срез template<class Т> class gslice array: template<class T> class mask array: template<class T> class indirect array; Эти классы имеют следующий смысл. О Valarray - основной класс для работы с массивами числовых значений. О Классы slice и gslice предназначены для определения BLAS-совместимых срезов в виде подмножества элементов массива значений. О Внутренние вспомогательные классы slice array, gslice.anay, mask anay и indirect, array предназначены для хранения временных данных. Непосредственное использование этих классов в программном интерфейсе невозможно, они создаются автоматически некоторыми операциями с массивами значений. Все классы определяются как шаблоны, параметризованные по типу элементов. В принципе элементы могут относиться к произвольному типу данных, но по природе природой массивов значений это должен быть числовой тип. Библиотека BLAS (Basic Linear Algebra Subprograms) содержит ргнструментарргй для выполнения базовых операций линейной алгебры, включая умножение матриц, решение систем уравнений и простые действия с векторами. Создание массивов значений при создании массива значений количество элементов обычно передается в параметре конструктора: 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)/s1 zeof(array[0])): Инициализация элементами массива со второго по четвертый std::valarray<1nt> va4(array+1.3): Массив значений создает копии передаваемых данных, поэтому для инициализации могут использоваться временные данные. Операции с массивами значений В массивах значений для обращения к элементам определен оператор индексирования []. Как обычно, первому элементу соответствует индекс 0: va[0] = 3 * va[l] + va[2]: Также для массивов значений определяются все обычные математические операторы (сложение, вычитание, умножение, деление с остатком, изменение знака, поразрядные операторы, операторы сравнения и логические операторы, а также полный набор операторов присваивания). Эти операторы вызываются для каждого элемента массива значений, обрабатываемого в ходе операции. Таким образом, результат операции с массивом значений представ.яяет собой массив значений, размер которого соответствует размеру операндов; этот массив значений содержит результат поэлементных вычислений. Например, рассмотрим следующую команду: val = va2 * va3: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 [ 169 ] 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |