Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы Осадчий А.В. гр.010902.docx
Скачиваний:
9
Добавлен:
24.04.2019
Размер:
143.34 Кб
Скачать

48. Обработка неуспешного выполнения new

Пример:

try

{

int *iptr = new int[BLOCK_SIZE];

//Если была достигнута эта строка, выделить память удалось

delete []iptr;

}

catch(CMemoryException* e)

{

//Выделить память не удалось, реагируем на ошибку

e->Delete();

}

Если оператору new не удастся выделить память, он вызовет исключение, что приведет к выполнению блока catch. В примере блок catch принимает в качестве параметра MFC-объект CMemoryException с информацией о причинах проблем, вызванных оператором new. В программах, не применяющих MFC, для этой цели можно создать собственные классы или же применять указатели на стандартные типы данных, например на строки. Параметром блока может быть и конструкция (...), которая указывает компилятору на то, что блок catch обрабатывает исключения любого типа, а не только связанные с памятью.

Если блоку catch удалось исправить ошибку, он попытается снова выполнить инструкцию блока try, вызвавшую исключение. Это намного удобнее использования фильтра EXCEPTION_CONTINUE_EXECUTION в SEH, так как блок catch все-таки выполняется. Если блок catch не получает исключения повторно, программа продолжает свою работу, переходя на следующий за ним оператор.

49. Стандартная библиотека шаблонов (stl). Основные типы контейнеров

Стандартная библиотека шаблонов (STL) (англ. Standard Template Library) — набор согласованных обобщённых алгоритмов, контейнеров, средств доступа к их содержимому и различных вспомогательных функций в C++.

В библиотеке выделяют пять основных компонентов:

Контейнер (container) — хранение набора объектов в памяти.

Итератор (iterator) — обеспечение средств доступа к содержимому контейнера.

Алгоритм (algorithm) — определение вычислительной процедуры.

Адаптер (adaptor) — адаптация компонентов для обеспечения различного интерфейса.

Функциональный объект (functor) — сокрытие функции в объекте для использования другими компонентами.

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

Контейнеры библиотеки STL можно разделить на четыре категории: последовательные, ассоциативные, контейнеры-адаптеры и псевдоконтейнеры.

Последовательные: vector, list, deque

Ассоциативные: set, multiset, map, multimap

Контейнеры-адаптеры: stack, queu,priority_queue

Псевдоконтейнеры: bitset, basic_string, valarray

50. Стандартная библиотека шаблонов (stl). Алгоритмы, методы, итераторы

Алгоритмы (algorithms) выполняют операции над содержимым контейнера. Существуют алгоритмы для инициализации, сортировки, поиска, замены содержимого контейнеров. Многие алгоритмы предназначены для работы с последовательностью (sequence), которая представляет собой линейный список элементов внутри контейнера.

Итераторы (iterators) - это объекты, которые по отношению к контейнеру играют роль указателей. Они позволяют получить доступ к содержимому контейнера примерно так же, как указатели используются для доступа к элементам массива.

С итераторами можно работать так же, как с указателями. К ним можно применить операции *, инкремента, декремента. Типом итератора объявляется тип iterator, который определен в различных контейнерах. Существует пять типов итераторов:

Итераторы ввода (input iterator) поддерживают операции равенства, разыменования и инкремента.

==, !=, *i, ++i, i++, *i++

Специальным случаем итератора ввода является istream_iterator.

Итераторы вывода (output iterator) поддерживают операции разыменования, допустимые только с левой стороны присваивания, и инкремента.

++i, i++, *i = t, *i++ = t

Специальным случаем итератора вывода является ostream_iterator.

Однонаправленные итераторы (forward iterator) поддерживают все операции итераторов ввода/вывода и, кроме того, позволяют без ограничения применять присваивание.

==, !=, =, *i, ++i, i++, *i

Двунаправленные итераторы (bidirectional iterator) обладают всеми свойствами forward-итераторов, а также имеют дополнительную операцию декремента (--i, i--, *i--), что позволяет им проходить контейнер в обоих направлениях. Итераторы произвольного доступа (random access iterator) обладают всеми свойствами bidirectional-итераторов, а также поддерживают операции сравнения и адресной арифметики, то есть непосредственный доступ по индексу.

i += n, i + n, i -= n, i - n, i1 - i2, i[n], i1 < i2, i1 <= i2, i1 > i2, i1 >= i2

В STL также поддерживаются обратные итераторы (reverse iterators). Обратными итераторами могут быть либо двунаправленные итераторы, либо итераторы произвольного доступа, но проходящие последовательность в обратном направлении.