09-06-2018 12:00

Стандартные библиотеки C++

Standard Template Library(STL), или стандартная библиотека шаблонов, повлияла на архитектурное строение C++ и стала ядром языка. STL – это набор универсальных компонентов и современных высокоэффективных алгоритмов для управления данными. Благодаря этой C++ библиотеке программисту стали доступны передовые достижения в области структур данных и эффективных алгоритмов без необходимости детального осмысления их строения и работы.

C++ выходит на новый уровень

Что такое динамические массивы C++?Вам будет интересно:Что такое динамические массивы C++?

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

Такой подход к организации работы с данными и алгоритмами выводит C++ качественно на другой уровень абстракции. Теперь программист не обременен созданием динамических массивов, списков, деревьев, хэшей. Также он может забыть о программировании разных алгоритмов поиска и обхода. С появлением STL программисту достаточно определить подходящий контейнер и использовать его функции-члены и алгоритмы обработки.

Перегрузка операторов в С++: основы, примерыВам будет интересно:Перегрузка операторов в С++: основы, примеры

Компоненты STL способны работать с произвольными типами данных. Это достигается тем, что все компоненты C++ библиотеки являются шаблонами, позволяющими использовать любые типы, если они способны выполнять необходимые операции. То есть контейнеры и алгоритмы обобщены по отношению к типам. Данная концепция называется обобщенным программированием.

Несмотря на изменения, которые были привнесены в C++ с появлением STL, не стоит забывать, что язык представлял собой эффективный и многофункциональный инструмент программирования и до ее появления, и все свои черты C++ сохранил (например, библиотека system или ctime) и с появлением STL лишь приумножил.

Компоненты библиотеки

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

Контейнеры

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

Существует 3 вида контейнеров:

  • Последовательные контейнеры. Они представляют собой упорядоченные коллекции. У каждого элемента своя позиция, которая зависит от времени вставки и не зависит от значения элемента. Последовательных контейнеров 5 разновидностей: array, vector, deque, list, forward list.
  • Ассоциативные контейнеры. Это также упорядоченные коллекции элементов, однако их позиция зависит от значения самого элемента или ключа, если элементами коллекции являются пары «ключ-значение». Существует 4 стандартных ассоциативных контейнеров: set, multiset, map, multimap.
  • Неупорядоченные ассоциативные контейнеры. В данном случае на порядок элементов в коллекции не влияет ни значение, ни время вставки элемента в коллекцию. Если вставить в такую коллекцию n-ое количество элементов, их порядок будет непредсказуем. Более того, с течением времени он может меняться. Неупорядоченными контейнерами являются: unordered set, unordered multiset, unordered map, unordered multimap.

Итераторы

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

Интерфейс самих итераторов похож на работу с указателями. Например, для получения итератором следующего элемента нужно выполнить операцию «++», а для получения значения элемента, на который в данный момент указывает итератор, – операцию «*». Таким образом, итератор похож на разновидность интеллектуального указателя.

Алгоритмы

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

Для крайне сложных задач разработан механизм вспомогательных функций, вызываемых алгоритмами. Это обеспечивает необходимую гибкость для обработки специфичных случаев. Например, программист может задать особый критерий поиска. С появлением лямбда-функций появились возможности для описания любых операций, проводимых над элементами контейнеров при их обходе. Таким образом библиотека функций C++ представляет очень гибкие возможности.

Противоречит ли STL концепциям ООП?

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

Заключение

STL представляет собой новый или усовершенствованный подход к программированию. Зачатки библиотеки появились давно. Первые идеи зародились в 1992-1994 годах. И после многолетней разработки STL полностью вошла в состав стандарта C++11. Библиотека обладает обширной функциональностью и отличной гибкостью, однако при этом сложна для понимания. Ее документация насчитывает сотни web-страниц (например, документация на сайте Microsoft библиотеки Visual C++), а описание занимает книги на 1000+ страниц. При этом библиотека находится в активной разработке.



Источник