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 3 4 6 2
0 1 2 3 4
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 3 4 6 2
0 1 2 3 4
ArrayList
• Adherir un nuevo 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.– void Remove(System::Object^ value);
• Limpiar la estructura.– void Clear();
• Obtener el número de elementos insertados.– int Count;
ArrayList – Ejemplo
• 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/