9. Collecciones en C++ .NET Programación Gráfica 9. Collecciones en C++ .NET
9.1 Arreglos
Arreglos Colección ordenada de elementos de un mismo tipo. Ordenada significa que cada elemento tiene una ubicación determinada dentro del arreglo y debemos conocerla para accederlo. 1 2 3 4 1 3 4 6 2
Arreglos 1 Dimensión Declaración <tipo>* nombre_variable; Inicialización nombre_variable = new <tipo>[<tamaño>]; Ejemplo int* vector; vector = new int[3];
Arreglos 2 Dimensiones Declaración <tipo>** nombre_variable; Inicialización *nombre_variable = new <tipo>[<tamaño_dim1>]; for(int i= 0; i< <tamaño_dim1>; i++) nombre_variable[i] = new <tipo>[<tamaño_dim2>];
Arreglos 2 Dimensiones Declaración char** tablero; Inicialización *tablero = new char[3]; for(int i= 0; i<3; i++) tablero[i] = new char[3];
9.1 Collecciones
Colecciones Las colecciones son estructuras de datos que nos permiten almacenar y administrar diversos tipos de datos y objetos. Para esto usamos el namespace System::Collections;
Colecciones Las más utilizadas son: ArrayList HashTable Queue Stack SortedList
Funcionalidades Adherir un nuevo elemento. Determinar si existe un elemento. Acceder a un elemento. Remover un elemento. Limpiar la estructura. Obtener el número de elementos insertados.
ArrayList Representa una lista de datos, la cual es dinámica; es decir, puede aumentar o disminuir en su tamaño. Declaración: ArrayList^ list; Inicialización: list = gcnew ArrayList();
ArrayList 1 2 3 4 1 3 4 6 2
ArrayList Adherir un nuevo elemento. Determinar si existe un elemento. int Add(System::Object^ value); void Insert(int index, System::Object^ value); Determinar si existe un elemento. bool Contains(System::Object^ value); Acceder a un elemento. <nombre_array>[ <index> ];
ArrayList Remover un elemento. Limpiar la estructura. void Remove(System::Object^ value); Limpiar la estructura. void Clear(); Obtener el número de elementos insertados. int Count;
ArrayList – Ejemplo PROBLEMA! Ej: Insertamos datos te tipo double y queremos acceder a ellos. list->Add(4.5); list->Add(5.4); list->Add(3.2); double dato = list[0]; PROBLEMA! En collections, todos los datos que manejan las estructuras de datos son de tipo Object^. Se debe hacer alguna conversión.
Casting Estático Para realizar un casting entre tipos de datos básicos, utilizamos static_cast. Se utiliza de la siguiente manera: static_cast < tipo_dato > ( dato_a_convertir ); double dato = static_cast< double >( list[0] );
Casting Dinámico Para realizar un casting entre objetos, utilizamos dynamic_cast. Se utiliza de la siguiente manera: dynamic_cast < tipo_objeto > ( objeto_a_convertir ); Sprite^ sp = dynamic_cast< Sprite^ >( list[0] );
Recorrer elementos Para recorrer elementos de una estructura podemos utilizar for. for(int i=0; i < list->Count; i++) { suma += static_cast < double >( list[i] ); }
Recorrer elementos Usando un enumerador, el cual no es más que una clase especializada que recorre todos los elementos, optimizando recursos. IEnumerator^ e = list->GetEnumerator(); while(e->MoveNext()) { suma += static_cast < double >(e->Current)); }
Remover elementos Se desea remover un elemento, al recorrer una estructura. while(e->MoveNext()) { double dato = static_cast < double >(e->Current)); if(dato < 4.0) list->Remove(e->Current); } PROBLEMA !!!
Remover elementos Solución Terminar el for una vez que se cumple una condición. while(e->MoveNext()) { double dato = static_cast < double >(e->Current)); if(dato < 4.0) list->Remove(e->Current); break; }
9.1 Collecciones Genéricas
Colecciones Genéricas Son colecciones con la misma funcionalidad que las colecciones no genéricas, con la diferencia que éstas están orientadas a trabajar con datos específicos. Pertenecen al namespace System::Collections::Generics; La clase ArrayList idéntica en gererics es List.
List List<int>^ listaNumeros = gcnew List<int>(); List<Sprite^> enemigos = gcnew List<Sprite^>(); Para los siguientes ejemplos utilizaremos una lista de balas y una de globos: List<Bala^>^ listaBalas = gcnew List<Bala^>(); List<Globo^>^ listaGlobos = gcnew List<Globo^>();
List List<int>^ listaNumeros = gcnew List<int>(); List<Sprite^> enemigos = gcnew List<Sprite^>();
List Para los siguientes ejemplos utilizaremos una lista de balas y otra de globos: List<Globo^> listaGlobos = gcnew List<Globo^>(); List<Bala^> listaBalas = gcnew List<Bala^>();
Recorrer listas Para recorrer una lista utilizamos nuevamente la clase IEnumerator. En el ejemplo se muestra cómo se mueven todas los globos de una lista a la vez.
Recorrer listas
Eliminar elementos Para eliminar elementos, podemos iterar nuevamente y hacer un break una vez se cumpla una condición. En el siguiente ejemplo se muestra cómo se elimina del SceneManager y de la lista de globos una vez éste haya atravesado la pantalla (de arriba abajo).
Eliminar elementos
Recorrer y eliminar elementos La idea no es recorrer la lista primero para mover globos y luego para eliminar los globos si atravesaron la pantalla, ya que estamos recorriendo 2 veces la lista. Veamos cómo podemos recorrer la lista y eliminar al mismo momento.
Recorrer y eliminar elementos Opción 1: Utilizando una lista temporal. Ejemplo: tenemos una lista de balas y una de globos y queremos ver si una bala a impactado un globo. Para esto el globo lo eliminamos normalmente, pero la bala la adherimos a una lista de balas.
Recorrer y eliminar elementos
Recorrer y eliminar elementos
Recorrer y eliminar elementos Opción 2: Inicializando el iterador cada vez que se desee remover un elemento.
Colecciones http://developmania.wordpress.com/2008/08/23/colecciones-de-datos-en-cnet-parte-ii-arraylist/
Preguntas ¿? 37