Обзор STL

   
На этом шаге мы дадим краткий обзор библиотеки STL.

   
Когда несколько лет назад в языке C++ появились шаблоны, лишь немногие из программистов на C++
могли предположить, какое влияние это окажет на стандарт библиотеки языка. Стандартная библиотека шаблонов
(Standard Template Library) была первоначально разработана сотрудниками Hewlett-Packard
А.А.Степановым и М.Ли совместно с Д.Р.Муссером из Ренсселэровского политехнического института.
После внесения незначительных поправок Комитет по стандартизации языка С++ принял STL,
сделав ее существенной составной частью стандартной библиотеки. Использование STL дает возможность
создавать более надежные, более переносимые и более универсальные программы, а также сократить расходы на
разработку. Это значит, что ни один профессиональный программист не может себе позволить пройти мимо этой
библиотеки.

   
Ядро стандартной библиотеки шаблонов включает три основных элемента:

  • контейнеры,
  • алгоритмы,
  • итераторы.

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

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

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

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

Таблица 1. Типы итераторов

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

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

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

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

   
Некоторые алгоритмы и контейнеры используют специальный тип функции, называемый предикатом (predicate).
Существует два варианта предикатов: унарный и . Унарный предикат предикат принимает один аргумент,
а бинарный - два. Эти функции возвращают значения ИСТИНА/ЛОЖЬ, но точные условия
определяются программистом.

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

   
На следующем шаге мы рассмотрим контейнерные классы.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий