На этом шаге мы кратко охарактеризуем компоненты, входящие в библиотеку.
Работа STL основана на взаимодействии разных структурных компонентов, среди которых центральное место занимают контейнеры, итераторы и алгоритмы.
Для повышения гибкости алгоритмам передаются вспомогательные функции, вызываемые в процессе работы алгоритмов. Тем самым общий алгоритм приспосабливается для конкретных целей, даже весьма специфических и сложных. Например, алгоритму можно передать нестандартный критерий поиска или специальную операцию группировки элементов.
Концепция STL основана на разделении данных и операций. Данные находятся под управлением контейнерных классов, а операции определяются адаптируемыми алгоритмами. Итераторы выполняют функции "клея", связывающего эти два компонента. Благодаря им любой алгоритм может работать с любым контейнером (рисунок 1).
Рис.1. Компоненты STL
Концепция STL в известном смысле противоречит исходным принципам объектно-ориентированного программирования: STL отделяет друг от друга данные и алгоритмы, вместо того чтобы объединять их. Тем не менее существуют очень веские аргументы в пользу такого решения. Вообще говоря, любая разновидность контейнера может быть объединена с любым алгоритмом, поэтому в результате образуется очень гибкая, но весьма компактная структура.
Среди важнейших особенностей STL следует назвать то, что все компоненты работают с произвольными типами. Как следует из названия (стандартная библиотека шаблонов), все компоненты оформляются в виде шаблонов, подходящих для любого типа (при условии, что этот тип способен выполнять необходимые операции). STL - хороший пример концепции унифицированного программирования. Контейнеры и алгоритмы унифицируются для произвольных типов и классов соответственно.
Однако в STL присутствуют еще более универсальные компоненты. При помощи адаптеров и объектов функций (или функторов) программист может дополнять, ограничивать и настраивать алгоритмы и интерфейсы для конкретных целей.
На следующем шаге мы рассмотрим контейнеры.