Статья посвящена вопросам программирования. Здесь дано понятие свойств объектно-ориентированного программирования, а также рассмотрены требования к контейнерам стандартной библиотеки шаблонов С++. Приводятся понятия некоторых шаблонов контейнерных классов, для которых реализованы алгоритмы в контейнерах.
Ключевые слова: объектно-ориентированное программирование, инкапсуляция, наследование, полиформизм, контейнеры, шаблоны.
Современное программирование уже давно превратилось в объектно-ориентированное программирование, которое позволяет программистам оптимизировать программу для абстрактных объектов с похожим алгоритмом работы. ООП позволяет программисту структурировать программу (при этом нужно уметь объектно мыслить). Как известно ООП обладает тремя свойствами, которые делают программу легко модифицируемой. К этим свойствам относятся: инкапсуляция, наследование и полиформизм.
Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Некоторые языки (например, С++) отождествляют инкапсуляцию с сокрытием, но большинство (Smalltalk, Eiffel, OCaml) различают эти понятия.
Наследование — свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником, дочерним или производным классом.
Полиморфизм — свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Ещё одно понятие в программировании — это контейнеры. Контейнер в программировании — тип, позволяющий инкапсулировать в себе объекты других типов. Контейнеры, в отличие от коллекций, реализуют конкретную структуру данных.
Среди широких масс программистов наиболее известны контейнеры, построенные на основе шаблонов, однако существуют и реализации в виде библиотек (наиболее широко известна библиотека GLib). Кроме того, применяются и узкоспециализированные решения. Примерами контейнеров в C++ являются контейнеры из стандартной библиотеки шаблонов (Standard Template Library, STL) — map, vector и др. В контейнерах часто встречается реализация алгоритмов для них.
Стандартная библиотека C++ также содержит ряд специализированных контейнерных классов — это так называемые контейнерные адаптеры (стек, очередь, приоритетная очередь), битовые поля и массивы значений. Все эти контейнеры обладают специальным интерфейсом, не соответствующим общим требованиям к контейнерам STL.
Ниже сформулированы общие возможности всех контейнерных классов STL. В большинстве случаев речь идет о требованиях, которые должны выполняться всеми контейнерами STL. Ниже перечислены три основных требования.
‒ Контейнеры должны поддерживать семантику значений вместо ссылочной семантики. При вставке элемента контейнер создает его внутреннюю копию, вместо того чтобы сохранять ссылку на внешний объект. Следовательно, элементы контейнера STL должны поддерживать копирование. Если объект, который требуется сохранить в контейнере, не имеет открытого копирующего конструктора или копирование объекта нежелательно (например, если оно занимает слишком много времени или элементы должны принадлежать сразу нескольким контейнерам), в контейнер заносится указатель или объект указателя, ссылающийся на этот объект.
‒ Элементы в контейнере располагаются в определенном порядке. Это означает, что при повторном переборе с применением итератора порядок перебора элементов должен остаться прежним. В каждом типе контейнера определены операции, возвращающие итераторы для перебора элементов. Итераторы представляют собой основной интерфейс для работы алгоритмов STL.
‒ В общем случае операции с элементами контейнеров небезопасны. Вызывающая сторона должна проследить за тем, чтобы параметры операции соответствовали требованиям, Нарушение правил (например, использование недействительного индекса) приводит к непредсказуемым последствиям. Обычно STL не генерирует исключений в своем коде. Но если исключение генерируется пользовательскими операциями, вызываемыми контейнером STL, ситуация меняется.
Любой контейнерный класс содержит конструктор по умолчанию, копирующий конструктор и деструктор. Кроме того, предусмотрена возможность инициализации контейнера элементами из заданного интервала. Соответствующий конструктор позволяет инициализировать контейнер элементами другого контейнера, массива или просто элементами, прочитанными из стандартного входного потока данных. Такие конструкторы оформляются в виде шаблонных функций класса, поэтому различия возможны не только в типе контейнера, но и в типе элементов (при условии автоматического преобразования исходного типа элемента к итоговому типу).
Дадим определения некоторым шаблонам, для которых контейнеры реализуют алгоритмы.
Вектором называется абстрактная модель, имитирующая динамический массив при операциях с элементами. Однако стандарт не утверждает, что в реализации вектора должен использоваться именно динамический массив. Скорее этот выбор обусловлен ограничениями и требованиями к сложности операций.
Рис.1. Структура вектора
Чтобы использовать вектор в программе, необходимо включить в нее заголовочный файл
#incude
Дек очень похож на вектор. Он тоже работает с элементами, оформленными в динамический массив, поддерживает произвольный доступ и обладает практически тем же интерфейсом. Различие заключается в том, что динамический массив дека открыт с обоих концов. По этой причине дек быстро выполняет операции вставки и удаления как с конца, так и с начала.
Рис. 2. Логическая структура дека
Чтобы использовать деки в программе, необходимо включить в нее заголовочный файл
#incude
Отображения и мультиотображения. Элементами отображений и мультиотображений являются пары «ключ/значение». Сортировка элементов производится автоматически на основании критерия сортировки, применяемого к ключу. Отображения и мультиотображения отличаются только тем, что последние могут содержать дубликаты, а первые — нет
Рис. 3. Отображение и мультиотображение
Чтобы использовать отображение или мультиотображение в программе, необходимо включить в нее заголовочный файл
#incude
Итак, мы дали краткое понятие ООП, описание контейнеров STL C++, а также описание шаблонов контейнеров. Для тех желает заниматься серьёзным программированием, эти понятия просто необходимы, иначе не может быть речи об объектно-ориентированном программировании.
Литература:
- С++Стандартная библиотека. Для профессионалов/ Н.Джосьютис. — СП. Питер, 2004. — 730с.
- https://ru.wikipedia.org/wiki/Контейнер_(программирование)