Скачиваний:
190
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

Тема 5: Стандартная библиотека шаблонов stl.

1. Базовые принципы библиотеки шаблонов stl. Использование библиотеки stl. Заголовочные файлы complex, random.

Библиотека STL — набор шаблонных классов и функций общего

назначения. Ядро стандартной библиотеки шаблонов включает три основных

элемента: контейнеры, алгоритмы, итераторы. Они работают совместно друг

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

программирования.

+ здесь можно говорить о чем угодно из всех вопросов этой теме (особенно вопросы 2, 3, 13)

Standard library header <complex>

Standard library header <random>

используется для генерации псевдослучайных чисел

*и еще куча всякой такой непонятной всячины*

2. Понятие контейнера. Контейнеры-последовательности. Ассоциативные контейнеры. Виды контейнеров. Концепции контейнеров. Свойства базовых контейнеров. Виды сложностей выполнения операций: время компиляции, постоянная, линейная.

Контейнеры — это объекты, которые содержат в себе другие объекты.

Контейнеры можно разделить на три категории: последовательные

контейнеры (sequence containers), ассоциативные контейнеры (associative

containers) и адаптеры контейнеров.

Например, класс vector определяет динамический массив, класс queue

создает двустороннюю очередь, а класс list обеспечивает работу с линейным

списком. Эти контейнеры называются последовательными контейнерами и

являются базовыми в STL.

Помимо базовых, библиотека STL определяет ассоциативные

контейнеры, которые позволяют эффективно находить нужные значения на

основе ключей. Например, класс map обеспечивает хранение пар "ключ-

значение" и предоставляет возможность находить значение по заданному

уникальному ключу.

Каждый контейнерный класс определяет набор функций, которые

можно применять к данному контейнеру. Например, контейнер списка (list)

включает функции, предназначенные для выполнения вставки, удаления и

объединения элементов.

КОНЦЕПЦИИ КОНТЕЙНЕРОВ

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

Контейнер — это объект, который хранит в себе другие объекты одного типа.

Хранимые объекты могут быть объектами в смысле объектноориентированного программирования либо значениями встроенных типов. Данные, сохраненные в контейнере, принадлежат контейнеру. Это означает, что, когда время существования контейнера истекает, истекает и время хранения данных контейнера. Однако если данные являются указателями, то истечение срока существования указываемых ими данных не обязательно.

В контейнере нельзя сохранять объекты какого угодно вида. В частности, тип хранимых объектов должен допускать присваивание и конструирование копированием. Базовые типы удовлетворяют этим требованиям, как и типы классов — если только определение класса не объявляет конструктор копирования и/или операцию присваивания закрытыми или защищенными. В С++11 эти концепции уточняются за счет добавления таких терминов, как допускающий вставку копированием (CopyInsertable) и допускающий вставку переносом (MoveInsertable), но мы ограничимся несколько упрощенным, хотя и менее точным описанием.

Базовый контейнер не гарантирует, что его элементы будут сохранены в каком-то определенном порядке или же, что этот порядок не изменится, но подобные гарантии могут быть получены за счет уточнений концепции. Все

контейнеры предоставляют определенные функциональные возможности и операции. Некоторые из этих общих функциональных возможностей кратко описаны в таблице ниже. В таблице посредством X представляется тип контейнера (такой, например, как vector), Т — тип объекта, хранящегося в контейнере, а и b — значения типа X, r — значение типа Х&, а u — идентификатор типа X (т.е. если X представляет vector<int>, то u — это объект vector<int>).

3. Понятие итератора. Виды итераторов. Предназначение итераторов. Связь итераторов и указателей. Особенности использования итераторов. Операции, которые необходимо реализовать для создания класса-итератора.

Итераторы действуют подобно указателям. Они позволяют

циклически опрашивать содержимое контейнера практически так же, как это

делается с помощью указателя при циклическом опросе элементов массива.

Итераторы обрабатываются аналогично указателям. Их можно

инкрементировать и декрементировать. К ним можно применять оператор

разыменования адреса *. Итераторы объявляются с помощью типа iterator,

определяемого различными контейнерами.

Библиотека STL поддерживает реверсивные итераторы, которые

являются либо двунаправленными, либо итераторами произвольного

доступа, позволяя перемещаться по последовательности в обратном

направлении. Следовательно, если реверсивный итератор указывает на конец

последовательности, то после инкрементирования он будет указывать на

элемент, расположенный перед концом последовательности.

При ссылке на различные типы итераторов в описаниях шаблонов в

библиотеке STL используются термины, описанные в таблице ниже.

Свой класс итератор

Итератор следует наследовать от класса std::iterator. Сам по себе этот класс не реализует никаких методов, но объявляет необходимые типы, которые используются в стандартных алгоритмах.

Это шаблонный класс, первый параметр шаблона — тип итератора, так как собираемся использовать со стандартной библиотекой, то тип выбирается из следующих типов: input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag. Второй параметр тип значения которое хранится и возвращается операторами * и ->, теретий параметр — тип который может описывать растояние между итераторами, четвртый шаблонный параметр — тип указателя на значение, пятый — тип ссылки на значения. Обязательными являются первые два параметра.

Самый просто итератор — это InputIterator (input_iterator_tag), он должен поддерживать префиксную форму инкремента, оператор !=, оператор* и оператор -> (его реализовывать не буду, так как в примере итератор используется для типа int, и в этом случае operator-> бессмысленен). Помимо этого понадобится конструктор и конструктор копирования. В примере не предполагается создание итератора кроме, как методами begin и end класса контейнера, поэтому конструктор итератора будет приватным, а класс контейнера объявлен как дружественный.

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

* ресурс https://habr.com/ru/post/265491/