На этом шаге мы дадим краткий обзор библиотеки STL.
Когда несколько лет назад в языке C++ появились шаблоны, лишь немногие из программистов на C++ могли предположить, какое влияние это окажет на стандарт библиотеки языка. Стандартная библиотека шаблонов (Standard Template Library) была первоначально разработана сотрудниками Hewlett-Packard А.А.Степановым и М.Ли совместно с Д.Р.Муссером из Ренсселэровского политехнического института. После внесения незначительных поправок Комитет по стандартизации языка С++ принял STL, сделав ее существенной составной частью стандартной библиотеки. Использование STL дает возможность создавать более надежные, более переносимые и более универсальные программы, а также сократить расходы на разработку. Это значит, что ни один профессиональный программист не может себе позволить пройти мимо этой библиотеки.
Ядро стандартной библиотеки шаблонов включает три основных элемента:
Они работают совместно один с другим, предоставляя тем самым готовые решения различных задач программирования.
Контейнеры - это объекты, содержащие другие объекты. Существует несколько различных типов контейнеров. Например, класс vector определяет динамический массив, класс queue создает двустороннюю очередь, а класс list обеспечивает работу с линейным списком. Эти контейнеры называются последовательными контейнерами и являются базовыми в STL. Помимо базовых, библиотека STL определяет ассоциативные контейнеры, которые позволяют эффективно находить нужные значения на основе заданных ключевых значений (ключей). Например, класс map обеспечивает хранение пар "ключ-значение" и предоставляет возможность находить значение по заданному уникальному ключу.
Алгоритмы обрабатывают содержимое контейнеров. Их возможности включают средства инициализации, сортировки, поиска и преобразования содержимого контейнеров. Многие алгоритмы работают с заданным диапазоном контейнера.
Итераторы - это объекты, которые в той или иной степени действуют подобно указателям. Они позволяют циклически опрашивать содержимое контейнера практически так же, как это делается с помощью указателя при циклическом опросе элементов массива. Существуют пять типов итераторов, которые представлена в таблице 1.
Итераторы | Описание |
---|---|
Произвольного доступа (random access) | Сохраняют и считывают значения; позволяют организовать произвольный доступ к элементам контейнера |
Двунаправленные (bidirectional) | Сохраняют и считывают значения; обеспечивают инкрементно-декрементное перемещение |
Однонаправленные (forward) | Сохраняют и считывают значения; обеспечивают только инкрементное перемещение |
Входные (input) | Считывают, но не записывают значения; обеспечивают только инкрементное перемещение |
Выходные (output) | Записывают, но не считывают значения; обеспечивают только инкрементное перемещение |
Итераторы обрабатываются аналогично указателям. Их можно инкрементировать и декрементировать. К ним можно применять оператор разыменования адреса *. Итераторы объявляются с помощью типа iterator, определяемого различными контейнерами.
STL опирается не только на контейнеры, алгоритмы и итераторы, но и на другие стандартные компоненты. Основными из них являются распределители памяти, предикаты и функции сравнения.
Каждый контейнер имеет свой распределитель памяти (allocator). Распределители управляют выделением памяти для контейнера. Стандартный распределитель - это объект класса allocator, но при необходимости можно определять собственные распределители.
Некоторые алгоритмы и контейнеры используют специальный тип функции, называемый предикатом (predicate). Существует два варианта предикатов: унарный и . Унарный предикат предикат принимает один аргумент, а бинарный - два. Эти функции возвращают значения ИСТИНА/ЛОЖЬ, но точные условия определяются программистом.
Некоторые алгоритмы и классы используют специальный тип бинарного предиката, который сравнивает два элемента. Функции сравнения возвращают значение true, если их первый аргумент меньше второго. Функции сравнения идентифицируются с помощью типа Comp.
На следующем шаге мы рассмотрим контейнерные классы.