Стандартная библиотека шаблонов (STL) — это набор согласованных обобщенных алгоритмов, контейнеров, средств доступа к их содержимому и различных вспомогательных функций в C++.
Введение
Механизм шаблонов входит в состав компилятора C++ для того, чтобы предоставить возможность программистам сделать свой код более коротким за счет обобщенной системы программирования. Конечно, известны и типовые библиотеки, которые реализуют данный механизм, но STL считается наиболее эффективной библиотекой C++ на текущий момент.
Сегодня известно много ее реализаций, каждая из которых, хоть и реализована в рамках стандарта, имеет собственные расширения. Подобный подход обладает одним недостатком, а именно, не во всех случаях код будет функционировать одинаково с различными компиляторами. По этой причине пользователям настоятельно рекомендуется всегда следовать традиционным приемам, как бы хорошо они не владели конкретной реализацией библиотеки.
Стандартная библиотека шаблонов (STL)
Рассмотрим наиболее известные коллекции из данной библиотеки. Каждая из них обладает собственным набором шаблонных параметров для того, чтобы обеспечить максимальные удобства для наиболее широкого спектра решаемых задач. Для того чтобы использовать коллекцию в своем программном коде, пользователю следует применить следующую команду: #include ∠ T >, где T является названием коллекции.
Наиболее часто используемыми являются следующие коллекции:
- Vector является коллекцией компонентов, которые сохранены в массиве, изменяющегося по мере надобности размера (как правило, возрастающего).
- List является коллекцией, хранящей компоненты в форме двунаправленного связанного списка.
- Map является коллекцией, которая сохраняет пары типа ∠const Key, T>, то есть, все элементы представляют собой пару типа ∠ключ, значение>, причем однозначную, где каждому из ключей должно соответствовать единственное значение. Ключ является некоторой характеризующей значение величиной, для которой может применяться операция сравнения. Пары должны храниться в отсортированном формате, что позволит выполнить оперативный поиск по ключу, правда за это, к сожалению, приходится кое-чем пожертвовать, а именно, придется так осуществлять вставку, чтобы сортировка не была нарушена.
- Set является отсортированной коллекцией лишь одних ключей, то есть, значений, для которых может использоваться операция сравнения, причем значений уникальных, то есть, каждый ключ можно встретить во множестве лишь один раз.
- Multimap является коллекцией map, в которой не присутствует условие уникальности ключа, то есть, если пользователь выполнит поиск по ключу, то он получит не единственное значение, а совокупность компонентов с одинаковым значением ключа. Для применения в коде следует использовать #include ∠map>.
- Multiset является коллекцией с тем же отличием от set, что и multímap от map, то есть, с отсутствием условия уникальности ключа. Для того чтобы его подключить, следует использовать #include ∠set>.
Все известные библиотеки обладают своими классами для представления строк. В STL строки могут быть представлены в формате ASCII, а также и в формате Unícode, а именно:
- String является коллекцией однобайтных символов в формате ASCII.
- Wstring является коллекцией двухбайтных символов в формате Unícode. Может быть включена командой #ínclude ∠xstríng>.
Далее рассмотрим строковые потоки. Strstream применяется для того чтобы организовать STL-строкового сохранения простых типов данных. Рассмотрим конкретный пример:
Рисунок 1. Программа. Автор24 — интернет-биржа студенческих работ
Строковый поток может считаться буфером с нуль-терминатором в конце, по этой причине при первой распечатке в конце строки окажется мусор. Это означает, что получить реальное окончание можно не при помощи нуль-терминатора, а при помощи счетчика pcount(). Далее «реальная часть» потока будет скопирована в новую строчку, и пользователь получит распечатку уже без мусора.
Итератор является очень важным понятием в реализации динамических структур данных. Неформально итератор может быть представлен как абстракция, ведущая себя как указатель, возможно, с определенными ограничениями. Строго говоря, итератор является более общим понятием, и является объектной оберткой для указателей, по этой причине указатель является итератором. Приблизительно его устройство можно представить следующим образом:
Рисунок 2. Программа. Автор24 — интернет-биржа студенческих работ
Существуют следующие формализованные определения итератора:
- Итератор является средством обеспечения доступа к компонентам коллекции.
- Для всех конкретных классов STL итераторы должны определяться отдельно внутри класса данной коллекции.
Известны следующие типы итераторов:
- Итератор (forward) iterator, который предназначен для обхода коллекции от меньшего индекса к большему.
- Итератор reverse iterator, который предназначен для обхода коллекции от большего индекс к меньшему.
- Итератор random access iterator, который предназначен для обхода коллекции в любом направлении.
Ниже приведен пример применения итераторов для удаления половин компонентов коллекции:
Рисунок 3. Программа. Автор24 — интернет-биржа студенческих работ