2012-03-04 27 views
5

Estoy un poco confundido acerca de la diferencia entre contenedores y colecciones. Leí sobre ellos en Wikipedia y esto es lo que he entendido ...Diferencia entre la colección y el contenedor

Colecciones: Almacena el número variable de objetos. Ex. lista, establecer ...

Contenedores: DataStructures? Ex. dequeue, stack ...

Pero pensé que las colecciones como lista, árbol, etc. son estructuras de datos, entonces, ¿qué son los contenedores? También lo que quiere decir esto .. estructuras

de datos que implementan contenedores incluyen matrices, listas, mapas, colas, juegos, pilas, tablas, árboles y vectores.

+0

Dudo que haya una diferencia práctica. La mayoría de la gente parece usarlos de manera intercambiable. Sin embargo, puede haber algunas rarezas en las jerarquías OO. Según recuerdo, Java tiene una clase (o tal vez una interfaz) para contenedores, pero algunas cosas que uno pensaría que los contenedores no se ajustan a esa designación, entonces en las discusiones de Java, me puedo imaginar usando otro término para referirse al otro clases similares a contenedores (advertencia: no he usado Java desde hace tiempo, así que podría estar recordando el nombre incorrecto). –

Respuesta

6

Java en realidad no utiliza el término 'contenedor', excepto en el contexto de los componentes GUI AWT, en el que un Container representa un componente de interfaz gráfica de usuario que puede contener otros componentes.

Collection se utiliza en Java para estructuras de datos que contienen objetos, como usted la describe. ciencia

informática en general tiende a tratarlos como más o menos sinónimos.

8

" El estándar del lenguaje C++ (ISO/IEC 14882 a 1998 [E]) dice en la cláusula 23 que los contenedores son 'componentes que los programas en C++ pueden utilizar para organizar colecciones de información', y añade:" Contenedores son objetos que almacenan otros objetos. Ellos controlan la asignación y desasignación de estos objetos a través de constructores, destructores, insertar y borrar operaciones "Se pasa a la lista de los dos tipos generales de recipientes:. Secuencias y contenedores asociativos estándar

El C++ dice,". Una secuencia es un tipo de contenedor que organiza un conjunto finito de objetos, todos del mismo tipo, en una disposición estrictamente lineal." los tres tipos de secuencias son vector, lista, y deque.

C++ los contenedores no pueden contener ¡Tipos mezclados!

Quizás la colección de C# más útil no se considera una colección en absoluto. Las matrices de C# son mucho más potentes que las matrices de C++, y admiten nativamente muchas operaciones que requieren una clase en C++. Por ejemplo, la propiedad Length le dice la cantidad de elementos en la matriz, como el método size() en contenedores C++. "

llevan desde http://soa.sys-con.com/node/39460, se puede leer este artículo para entender bien los conceptos de contenedores y la recogida.

+6

'Las matrices C# son mucho más poderosas que las matrices C++' Sí, las manzanas no son naranjas. –

5

El estándar ISO C++ realmente no establece una distinción muy clara. Proporciona una definición formal de contenedor (23.2.1):

Los contenedores son objetos que almacenan otros objetos.

... sin embargo, ofrece ninguna definición formal de recolección y utiliza ese término un poco más general.Describe la tupla, por ejemplo, como una colección de objetos, aunque por la misma definición anterior, también es un contenedor .

Colecciones: Almacena el número variable de objetos. Ex. lista, establecer ...

Contenedores: DataStructures? Ex. dequeue, stack ..

Pero pensé que las colecciones como lista, árbol, etc. son estructuras de datos, , entonces cuáles son los contenedores. Además, ¿qué significa esto?

Por lo que yo veo, y la norma no especifica nada en contra, estos son tanto colecciones como contenedores. También son estructuras de datos, pero la "estructura de datos" es un término informático muy general para cualquier tipo de agregado que organiza datos de alguna manera.

Con C++, donde encontrará una distinción más útil es en los conceptos que definió el STL original, tal como lo concibió Stephanov.

Una secuencia es un contenedor de tamaño variable cuyos elementos están dispuestos en un orden lineal estricto. Admite la inserción y eliminación de elementos .

Lo anterior describe contenedores como list, deque, y vector.

Un contenedor asociativo ordenado es un tipo de contenedor asociativo. Los contenedores asociativos clasificados utilizan una relación de pedido en sus claves; dos claves se consideran equivalentes si ninguna es inferior a la otra. (Si la relación de orden entre mayúsculas y minúsculas comparación de cadenas , por ejemplo, entonces las teclas "abcde" y "ABCDE" son equivalente.)

Lo anterior describe contenedores como set y map.

Un contenedor asociativo de par es un contenedor asociativo que asocia una clave con algún otro objeto. El tipo de valor de un Pair Associative Container es un par. [1]

Lo anterior describe contenedores como map.

En cuanto a lectura adicional sobre este tema con respectos a las ligeras diferencias semánticas: OOP Terminology: "Container" & "Collection"

2

La diferencia es más del gusto que de fondo, pero la sensación que tengo al escuchar las dos terminologías es que

  • contenedor "tiene" los valores que contiene
  • colección "posee" el objeto al que se refiere.

Esto es claramente subjetiva, pero teniendo en cuenta cómo se implementan C contenedor ++ (semántica de valor) y cómo Java colloection comportan (polimorfismo de los objetos), y qué variables de Java técnicamente son (punteros autodereferenced) es probable que sea debido a la semántica del valor/puntero.

A C contenedor ++ no puede ser polimórficos en valores, pero puede ser homomorphic de punteros a los valores polimórficas, por lo que un C++ collection<T> puede ser simplemente un container<unique_ptr<T> > (elegir el contenedor que desea concretar), donde container<T> no tiene estricta correspondencia java.

Cuestiones relacionadas