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 que sigue 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 adecuada para cualquier escenario determinado.
Las estructuras de datos de contenedor 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 tipo 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 valor único almacenan cada objeto de forma independiente. Se puede acceder a los objetos directamente, mediante una construcción de bucle del lenguaje (por ejemplo, for loop ) o con un iterador .
Un contenedor asociativo utiliza una matriz , un mapa o un diccionario asociativo, compuesto por 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 clases.
Los tipos de datos abstractos de contenedor incluyen:
Las estructuras de datos comunes utilizadas 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 , 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 resulta en un tedioso proceso de escribir y mantener una colección de contenedores para cada tipo de elemento. [3] : 274–276
Muchos tipos elementales (por ejemplo, enteros o números 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, por supuesto, que 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