Справочник по C/C++
Обзор STL

Ядро стандартной библиотеки шаблонов составляют три основных элемента: контейнеры, алгоритмы и итераторы. Они работают совместно один с другим, предоставляя тем самым готовые решения различных проблем программирования.

Контейнеры

Контейнеры - это объекты, содержащие другие объекты. Существует несколько различных типов контейнеров. Например, класс vector, определяет динамический массив, класс queue создает двустороннюю очередь, а класс list обеспечивает работу с линейным списком. Эти контейнеры называются последовательными контейнерами, поскольку в терминологии STL последовательность представляет собой линейный список. Помимо базовых контейнеров, библиотека STL определяет ассоциативные контейнеры, которые позволяют эффективно находить нужные значения на основе заданных ключевых значений(ключей). Например, класс map обеспечивает доступ к значениям с уникальными ключами, т.е. хранит пару "ключ/значение" и предоставляет возможность находить значение по заданному ключу.

Каждый контейнерный класс определяет набор функций, которые можно применять к данному контейнеру. Например, контейнер списка включает функции, предназначенные для выполнения вставки, удаления и объединения элементов. А стек включает функции, которые позволяют помещать значения в стек и извлекать значения из стека.

Алгоритмы

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

Итераторы

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

Итераторы Разрешаемый доступ
Произвольного доступа (random access) Сохраняют и считывают значения; позволяют организовать произвольный доступ к элементам
Двунаправленные (bidirectional) Сохраняют и считывают значения; обеспечивают инкрементно-декрементное перемещение
Однонаправленные (forward) Сохраняют и считывают значения; обеспечивают только инкрементное перемещение
Входные (input) Считывают, но не записывают значений; обеспечивают только инкрементное перемещение
Выходные (output) Записывают, но не считывают значения; обеспечивают только инкрементное перемещение

В общем случае итератор, который имеет большие возможности доступа, можно использовать вместо итератора с меньшими возможностями. Например, однонаправленным итератором можно заменить входной итератор.

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

Библиотека STL поддерживает реверсивные итераторы, которые являются либо двунаправленными, либо итераторами случайного доступа, т.е. позволяют перемещаться по последовательности в обратном направлении. Следовательно, если реверсивный итератор указывает на конец последовательности, то после инкрементирования он будет указывать на элемент, расположенный перед концом последовательности.

При ссылке на различные типы итераторов в описаниях шаблонов в этом разделе будут использованы следующие термины.

Термин Представляемый итератор
BiIter Двунаправленный
ForIter Однонаправленный
InIter Входной
OutIter Выходной
RandIter Произвольного доступа

Другие элементы библиотеки STL

STL опирается не только на контейнеры, алгоритмы и итераторы, но и на другие стандартные компоненты. Основными из них являются распределители памяти, предикаты, функции сравнения и объекты-функции.

Каждый контейнер имеет свой распределитель памяти (allocator). Распределители управляют выделением памяти при создании нового контейнера. Стандартный распределитель - это объект класса allocator, но при необходимости (в специализированных приложениях) можно определять собственные распределители. В большинстве случаев стандартного распределителя вполне достаточно,

Некоторые алгоритмы и контейнеры используют специальный тип функции, называемый предикатом(predicate). Существует два варианта предикатов: унарный и бинарный. Унарный предикат принимает один аргумент, а бинарный - два. Эти функции возвращают результаты "истина/ложь", но точные условия, которые заставят их вернуть значение истины или лжи, определяются программистом. В остальной части этой главы, когда потребуется унарная функция-предикат, на это будет указано с помощью типа UnPred. При необходимости использования бинарного предиката будет применяться тип BinPred. В бинарном предикате аргументы всегда расположены в порядке первый, второй относительно функции, которая вызывает этот предикат. Как для унарного, так и для бинарного предикатов аргументы будут содержать значения, тип которых совпадает с типом объектов, сохраняемых данным контейнером.

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

Помимо заголовков, требуемых различными классами STL, стандартная библиотека C++ включает заголовки <utility> и <functional>, которые обеспечивают поддержку STL. Например, в заголовке <utility> определяется шаблонный класс pair, который может хранить пару значений.

Шаблоны в заголовке <functional> позволяют создавать объекты, которые определяют функцию operator(). Эти объекты называются объектами-функциями, и их во многих случаях можно использовать вместо указателей на функции. Существует несколько встроенных объектов-функций, объявленных в заголовке <functional>.

plus minus multiplies divides modulus
negateq  equal_to not_equal_to  greater greater_equal
less less_equal  logical_and logical_or  logical_not

Возможно, самой широко используемой объектом-функцией является less, которая определяет, когда один объект меньше другого, Объекты-функции можно использовать вместо реальных указателей на функции в алгоритмах STL, о которых пойдет речь ниже. Используя объекты-функции вместо указателей на функции, библиотека STL генерирует более эффективный программный код.

"Обитателями" библиотеки STL являются и такие сущности, как связка(binder) и инвертор(negator). Связка связывает аргумент с объектом-функцией, а инвертор возвращает дополнение предиката.

Наконец, следует познакомиться еще с одним термином: адаптер(adaptor). По логике библиотеки STL адаптер преобразует один объект в другой. Например, контейнер queue (который создает стандартную очередь) является адаптером для контейнера deque.






Нет комментариев.



Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: