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

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

вает два элемента строки, второй — с длиной 3 и шагом 1 — описывает три элемента столбца):

Исходная матрица: Обобщенный срез:

00 01 02 00 01

10 11 12 10 11

20 21 22 20 21 30 31 32

Расположение в памяти:

00 10 20 30 01 11 21 31 02 12 22 32

Теперь, чтобы, например, обнулить элементы подматрицы 2x3, можно записать:

valarray<double> v(l. 12); // Создаем массив из единиц

int length[] = {2. 3}:

int str[] = {4, 1};

valarray<int> len (length, 2);

valarray<int> d (str, 2);

// Обнуляем элементы v[0], v[l]. v[2], v[4], v[5]. v[6]:

v[gslice(0. len, d)] = 0:

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

Если требуется задать произвольное подмножество элементов массива, для которого нельзя описать закон изменения индексов, используют логический массив

mask_array, который представляет собой valarray<bool>. Элемент этого массива, равный true, означает, что соответствующий элемент val array включается в подмножество. Для mask_array определен тот же набор полей и методов класса, что и

для gslice_array.

Объекты этого класса получаются в результате использования в операциях обобщенной индексации val array, описанных в предыдущем разделе, например:

bool m[] = {true, true, false, true, false};

valarray<bool> mask (m, 5);

// Элементам номер 0, 1 и 2 массива v6 присваивается

// значение синуса соответствующих элементов массива v4,

// описанного в предыдущем разделе:

valarray<int> v6 = sin(v4[mask]);

Другой способ выделения произвольного подмножества, позволяющий переупорядочивать элементы val array, является косвенный массив indirect_array. В нем задается последовательность индексов массива. Объект этого класса создается при использовании в качестве индекса valarray<size_t>, например:

int i[] = {3. 2. 4, 0. 1}: valarray<int> index(i, 5);

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

377

valarray<int> v7 = v4[index];

// v7[0] = v4[3], v7[l] = v4[2], v7[2] = v4[4], v7[3] = v4[0]. v7[4] = v4[l]

Число элементов массива, используемого в качестве индекса, не должно превышать число элементов в индексируемом массиве.

Перечисленные классы — slice_array, gslice_array, mask_array и indirect_array — нельзя создавать впрямую и копировать. Они прозрачны для пользователя и создаются в результате использования в качестве индекса массива val array срезов, обобщенных срезов, логических массивов val array и массивов типа size_t соответственно.

Глава 16

Другие средства стандартной библиотеки

Кроме рассмотренных, стандартная библиотека C++ содержит средства поддержки языка, диагностики, локализации, работы с комплексными числами, более 200 функций, унаследованных из стандартной библиотеки С, а также типов для их поддержки и макросов.

Средства поддержки языка включают описания функций и типов, которые должны присутствовать при выполнении программы. Они включают в себя поддержку запуска и завершения программы, операций new и delete, описание свойств встроенных типов данных, динамическую идентификацию типов, обработку исключений и другие средства времени выполнения. Эти средства представлены в заголовочных файлах <cstddef>, <limits>, <climits>, <cfloat>, <cstdlib>, <new>, <typeinfo>, <exception>, <cstdarg>, <csetjmp>, <ctime>, <csignal>.

В библиотеке (файл <limits>) определен шаблон класса numericjimits, в котором определяются свойства типа данных, зависящие от реализации: диапазон, точность, наличие знака и т. д. Для каждого из основных типов данных определена специализация шаблона numericj imits. Эти же характеристики определяются и в константах, описанных в заголовочных файлах <c1imits> и <cfloat>, унаследованных из библиотеки С, например:

FLT_DIG — количество верных значащих цифр в величине типа float;

FLT_MIN — минимальное нормализованное число с плавающей точкой, которое может быть представлено типом float;

UINT_MAX — максимальное значение, которое может принимать величина типа unsigned int (должно быть не менее 65 535).

Полностью эти константы описаны в приложении 5.

Для обработки ошибок при выделении памяти в библиотеке описан класс bad_alloc, тип функций-обработчиков ошибок newjiandler и функция установки нового обработчика set_new_handler.