Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
67
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Часть III. Стандартная библиотека

Функции сдвига shift и cshift и применение функции apply возвращают новый массив, при этом исходный остается без изменений. При логическом сдвиге освободившиеся значения заполняются значением по умолчанию для данного типа элементов.

Повторная инициализация с помощью resize не предназначена для того, чтобы динамически изменять размер существующего массива. Предполагается, что valarray используется для быстрой работы с числами и его размер остается постоянным в течение всего времени его использования.

К массивам можно применять функции abs, acos, asin, atari, atan2, cos, cosh, exp, log, loglO, pow, sin, sinh, sqrt, tan, tanh, например:

v2 = cos(v3); // v2[i] = cos(v3[i]) для i = 1 100

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

Для val array определены логические операции <, >, ==, != и т. д., дающие в результате массив типа bool, каждый элемент которого равен результату операции, примененной к паре соответствующих элементов сравниваемых массивов, например:

tempiate<class T> valarray<bool>

operator== (const valarray<T>&, const valarray<T>&): tempiate<class T> valarray<bool>

operator!= (const valarray<T>&, const valarray<T>&);

Если размеры массивов, участвующих в операции, не совпадают, результат не определен.

Вспомогательные классы

Класс si ice (срез) позволяет задать подмножество индексов элементов массива:

class slice{ public: sliceO:

slice(size_t start. size_t size, size_t stride): size_t startO const: // индекс первого элемента

size_t sizeO const; // число элементов

size_t strideO const; //шаг

}: Шаг — это расстояние между двумя элементами среза. Например, sliceO, 4, 2) задает срез, состоящий из элементов массива с номерами 3, 5, 7, 9, a sliced. 3. 4) — с номерами 1, 5, 9. Таким образом, с помощью срезов можно представить массив как матрицу, задав в нем строку или столбец.

Теперь можно привести пример операции индексации подмножеств массива val array, описанной в предыдущем разделе: оператор a [si iced, 5. 3)] = b выполнит присваивание массива b только элементам массива а, заданным срезом.

Глава 15. Средства для численных расчетов

375

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

slice_array<double>& si = v2[slice(0, v.sizeO / 10, 10)];

// Увеличить на 5 первый столбец матрицы 10 X 10:

si += 5;

slice_array<double>& s2 = v2[slice(0, v.sizeO / 10, 1)];

// Увеличить в 2 раза каждый элемент первой строки матрицы 10 X 10:

s2 *= 2;

В шаблоне si ice_array определены сложные операции присваивания (+=, *=, >= и т. д.), например:

void operator*= (const valarray<T>&) const; void operator/= (const valarray<T>&) const;

Они выполняют указанные действия с аргументом и элементами исходного массива, заданными срезом, на которые ссылается si ice_array. Кроме того, определена операция присваивания скалярного значения, которая выполняет присваивание всем элементам исходного массива, входящим в срез.

Стандартная библиотека не предоставляет средств для работы с матрицами, но с помощью абстракций, задаваемых срезами, можно эффективно работать с массивом valarray как с матрицей произвольной размерности.

Если требуется работать с подмножеством, которое нельзя задать одним срезом, используется шаблон gslice — обобщенный срез:

class gslicef public: gsliceO; gslice(size_t s, const valarray<size_t>& len,

const valarray<size_t>& d); size_t start0 const; // индекс первого элемента valarray<size_t> sizeO const; // число элементов в измерении valarray<size_t> strideO const; // шаги для индекса[0]. индекса[1]....

}: Обобщенный срез задает несколько срезов. Индекс начального элемента указывается первым параметром s, размеры срезов передаются через массив len, а шаги — через массив d. Размерности массивов, определяющие количество задаваемых срезов, должны совпадать.

Например, если задать параметры

start = 0 len = {2, 3} d = {4, 1}

получим последовательность индексов массива

к = (0.1) х 4 + (0.1,2) х 1

которые дадут в результате матрицу 2x3 из левого верхнего угла матрицы 3x4, расположенной в памяти по столбцам (первый срез с длиной 2 и шагом 4 описы-

376