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