En informática , un contenedor es una clase o una estructura de datos [1] [2] cuyas instancias son colecciones de otros objetos. En otras palabras, almacenan objetos de forma organizada siguiendo reglas de acceso específicas.
El tamaño del contenedor depende de la cantidad de objetos (elementos) que contiene. Las implementaciones subyacentes (heredadas) de varios tipos de contenedores pueden variar en tamaño, complejidad y tipo de lenguaje, pero en muchos casos brindan flexibilidad para elegir la implementación correcta para cualquier escenario determinado.
Las estructuras de datos contenedores se utilizan comúnmente en muchos tipos de lenguajes de programación .
Los contenedores se pueden caracterizar por las siguientes tres propiedades:
Se espera que las clases contenedoras implementen métodos similares a CRUD para hacer lo siguiente:
A veces los contenedores se implementan junto con iteradores .
Los contenedores pueden clasificarse como contenedores de valor único o contenedores asociativos .
Los contenedores de un solo valor almacenan cada objeto de forma independiente. Se puede acceder a los objetos directamente, mediante una construcción de bucle del lenguaje (por ejemplo, bucle for ) o con un iterador .
Un contenedor asociativo utiliza una matriz , un mapa o un diccionario asociativo, compuesto de pares clave-valor, de modo que cada clave aparece como máximo una vez en el contenedor. La clave se utiliza para encontrar el valor, el objeto, si está almacenado en el contenedor. Los contenedores asociativos se utilizan en lenguajes de programación como plantillas de clase.
Los tipos de datos abstractos de contenedor incluyen:
Las estructuras de datos comunes que se utilizan para implementar estos tipos abstractos incluyen:
Los kits de herramientas de widgets también utilizan contenedores, que son widgets especiales para agrupar otros widgets, como ventanas o paneles . Aparte de sus propiedades gráficas, tienen el mismo tipo de comportamiento que las clases contenedoras, ya que mantienen una lista de sus widgets secundarios y permiten agregar, eliminar o recuperar widgets entre sus hijos.
Las abstracciones de contenedores se pueden escribir en prácticamente cualquier lenguaje de programación, independientemente de su sistema de tipos. [3] : 273 Sin embargo, en lenguajes de programación orientados a objetos fuertemente tipados puede resultar algo complicado para un desarrollador escribir contenedores homogéneos reutilizables.
Debido a las diferencias en los tipos de elementos, esto da como resultado un proceso tedioso de escritura y mantenimiento de una colección de contenedores para cada tipo de elemento. [3] : 274–276
Muchos tipos elementales (por ejemplo, números enteros o flotantes) son inherentemente incompatibles entre sí debido al tamaño de memoria que ocupan y su significado semántico y, por lo tanto, requieren contenedores diferentes (a menos que, por supuesto, sean mutuamente compatibles o convertibles). [3] : 274–276 Los lenguajes de programación modernos ofrecen varios enfoques para ayudar a resolver el problema: [3] : 274–281