Contenedor (tipo de datos abstracto)

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar

En informática, un contenedor es una clase o una estructura de datos cuyas instancias son colecciones de otros objetos. En otras palabras, almacenan objetos de una manera 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 correcta para cualquier escenario determinado.

Las estructuras de datos de contenedores se utilizan comúnmente en muchos tipos de lenguajes de programación.

Función y propiedades

Los contenedores se pueden caracterizar por las tres propiedades siguientes:

  • acceso, esa es la manera de acceder a los objetos del contenedor. En el caso de los arrays, el acceso se realiza con el índice de matriz. En el caso de las pilas, el acceso se realiza según el orden LIFO (último en, primero fuera) y en el caso de las colas se hace de acuerdo con el orden FIFO (primero en, primero fuera);
  • almacenamiento, esa es la manera de almacenar los objetos del contenedor;
  • traversal, esa es la forma de atravesar los objetos del contenedor.

Se espera que las clases contenedoras implementen métodos similares a CRUD para hacer lo siguiente:

  • crear un contenedor vacío (constructor);
  • insertar objetos en el contenedor;
  • eliminar objetos del contenedor;
  • eliminar todos los objetos en el contenedor (clear);
  • acceder a los objetos en el contenedor;
  • acceder al número de objetos en el contenedor (cuenta).

A veces, los contenedores se implementan junto con iteradores.

Tipos

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, un bucle for) o con un iterador.

Un contenedor asociativo utiliza una matriz, mapa o 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:

  • colas FIFO
  • Apilaciones LIFO
  • Cargos prioritarios
  • Cuadros de búsqueda (LUTs)
  • Estructuras de datos asociadas con claves
    • Sets, containing and indexing objects by value or by specific property;
    • Mapas, asociando a cada clave un "valor" para la búsqueda

Las estructuras de datos comunes que se utilizan para implementar estos tipos abstractos incluyen:

  • Arrays y sus derivados
  • Listas vinculadas
  • Árboles de búsqueda binarios (BSTs), particularmente los BST autónomos
  • Mesas de baño

Contenedores gráficos

Los kits de herramientas de widgets también utilizan contenedores, que son widgets especiales para agrupar otros widgets, como ventanas y 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.

En idiomas de tipo estadístico

Las abstracciones de contenedores se pueden escribir en prácticamente cualquier lenguaje de programación, independientemente de su sistema de tipos. 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 genera un proceso tedioso de escritura y mantenimiento de una colección de contenedores para cada tipo de elemento.

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 compatibles entre sí o convertibles). Los lenguajes de programación modernos ofrecen varios enfoques para ayudar a resolver el problema:

Tipo básico universal
Un tipo que es universalmente asignable por cualquier otro (por ejemplo, clase de Objeto raíz).
Rechazarse;
Sustitución de clase
Los tres enfoques anteriores arriba se utilizan para lenguajes de tipo débil; estos usualmente implican herencia y polimorfismo compartido por tipos.
Tipos de unión (C/C++)
Permite almacenar tipos de diferentes tamaños de datos; es difícil asegurar qué tipo se almacena en un sindicato sin embargo después de la recuperación y debe ser seguido cuidadosamente.
Conversión de tipo
Plantillas o Genéricos
Garantiza la reutilizabilidad y la seguridad del tipo; puede ser pensado como una herencia inversa. Sin embargo, este enfoque puede requerir la aplicación de una especialización de plantillas que es un proceso que consume mucho tiempo dado que los tipos difieren en sus métodos.

Véase también

  • Lista de estructuras de datos
  • Biblioteca Estándar de Plantillas#Contenedores
  • Colección (tipo de datos abstractos)
  • Java ConcurrentMap

Referencias

  1. ^ Paul E. Black (ed.), entrada para estructura de datos dentro Diccionario de Algoritmos y Estructuras de Datos. US National Institute of Standards and Technology.15 de diciembre de 2004. Acceso 4 Oct 2011.
  2. ^ Entrada estructura de datos en la Enciclopædia Britannica (2009) Entrada en línea Acceso 4 Oct 2011.
  3. ^ a b c d e Budd, Timothy (1997). Introducción a la programación orientada hacia objetos (2a edición). Lectura, Mass.: Addison-Wesley. ISBN 0-201-82419-1. OCLC 34788238.
  • Declaración y inicialización de la estructura de datos
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save