В информатике контейнер — это класс или структура данных [1] [2] , экземпляры которых представляют собой коллекции других объектов. Другими словами, они хранят объекты организованным образом с соблюдением определенных правил доступа.
Размер контейнера зависит от количества содержащихся в нем объектов (элементов). Базовые (унаследованные) реализации различных типов контейнеров могут различаться по размеру, сложности и типу языка, но во многих случаях они обеспечивают гибкость в выборе правильной реализации для любого конкретного сценария.
Структуры данных-контейнеры обычно используются во многих типах языков программирования .
Контейнеры можно охарактеризовать следующими тремя свойствами:
Ожидается, что классы-контейнеры будут реализовывать CRUD -подобные методы для выполнения следующих действий:
Контейнеры иногда реализуются совместно с итераторами .
Контейнеры можно классифицировать как контейнеры с одним значением или ассоциативные контейнеры .
Контейнеры с одним значением хранят каждый объект независимо. Доступ к объектам можно получить напрямую, с помощью конструкции языкового цикла (например, for Loop ) или с помощью итератора .
Ассоциативный контейнер использует ассоциативный массив , карту или словарь, состоящий из пар ключ-значение, так что каждый ключ появляется в контейнере не более одного раза. Ключ используется для поиска значения, объекта, если он хранится в контейнере. Ассоциативные контейнеры используются в языках программирования в качестве шаблонов классов.
К абстрактным типам данных контейнера относятся:
Общие структуры данных, используемые для реализации этих абстрактных типов, включают:
Наборы инструментов для виджетов также используют контейнеры, которые представляют собой специальные виджеты для группировки других виджетов, таких как окна , панели . Помимо своих графических свойств, они имеют тот же тип поведения, что и классы-контейнеры, поскольку они хранят список своих дочерних виджетов и позволяют добавлять, удалять или извлекать виджеты среди своих дочерних элементов.
Абстракции контейнера могут быть написаны практически на любом языке программирования, независимо от его системы типов. [3] : 273 Однако в строго типизированных объектно-ориентированных языках разработчику может быть несколько сложно писать многоразовые однородные контейнеры.
Из-за различий в типах элементов это приводит к утомительному процессу написания и хранения коллекции контейнеров для каждого типа элемента. [3] : 274–276.
Многие типы элементов (например, целые числа или числа с плавающей запятой) по своей сути несовместимы друг с другом из-за занимаемого ими размера памяти и их семантического значения и, следовательно, требуют разных контейнеров (если, конечно, они не являются взаимно совместимыми или конвертируемыми). [3] : 274–276 Современные языки программирования предлагают различные подходы, помогающие решить проблему: [3] : 274–281