Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП на языке С++.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.8 Mб
Скачать

8. Стандартная библиотека шаблонов

8.1. Введение в stl

Создание стандартной библиотеки шаблонов (Standard Template Library, STL) является результатом многолетних исследований под руководством Александра Степанова и Менга Ли из компании Hewlett-Packard и Девида Мюссера из Rensselaer Polytechnic Institute.

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

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

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

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

Парадигму обобщенного программирования можно сформулировать следующим образом:

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

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

Поскольку STL строится на основе шаблонов классов, входящие в неё алгоритмы и структуры применимы почти ко всем типам данных

Ядро библиотеки образуют три элемента: контейнеры, алгоритмы и итераторы.

Контейнеры (containers) – это объекты, предназначенные для хранения других элементов. Вектор, линейный список, множество.

Ассоциативные контейнеры (associative containers) позволяют с помощью ключей получить быстрый доступ к хранящимся в них значениям.

В каждом классе-контейнере определен набор функций для работы с ними. Например, список содержит функции для вставки, удаления и слияния элементов.

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

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

Вдобавок к контейнерам, алгоритмам и итераторам в STL поддерживается ещё несколько стандартных компонентов. Главными среди них являются распределители памяти, предикаты и функции сравнения.

У каждого контейнера имеется определенный для него распределитель памяти (allocator), который управляет процессом выделения памяти для контейнера.

По умолчанию распределителем памяти является объект класса allocator. Можно определить собственный распределитель.

В некоторых алгоритмах и контейнерах используется функция особого типа, называемая предикатом. Предикат может быть унарным и бинарным. Возвращаемое значение: истина либо ложь. Точные условия получения того или иного значения определяются программистом. Тип унарных предикатов UnPred, бинарных – BinPred. Тип аргументов соответствует типу хранящихся в контейнере объектов.

Специальный тип бинарного предиката для сравнения двух элементов называется функцией сравнения (comparison function). Функция сравнения возвращает истину, если первый элемент меньше второго. Типом функции является тип Comp.

Для поддержки контейнерных классов STL включает так называемые классы-утилиты Utility-классы. Заголовочные файлы <utility.h> и <function.h>. Например, шаблон класса pair (пара) для хранения пары объектов.

Шаблоны из заголовочного файла <function.h> помогают создавать объекты, определяющие оператор-функцию operator(). Эти объекты называются объектами-функциями (function objects) и во многих случаях могут использоваться вместо указателей на функции, что позволяет генерировать более эффективный код. Например, класс-функция less (меньше), который позволяет определить, является значение одного объекта меньше, чем другого. Это предикат.

template<class T> struct less: public binary_function<T,T,bool>

{bool operator()(const T& x,const T& y)const

//возвращает результат сравнения x<y

{return x<y;}

};

Для поддержки единого определения типов аргументов и типа возвращаемого значения для различных объектов-функций с двумя аргументам в STL введен вспомогательный базовый класс

template<class Arg1,class Arg2,class Result> struct binary_function{}

typedef Arg1 first_argument_type;

typedef Arg2 second_argument_type;

typedef Result result_type;