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.
0
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
0
1
2
3
4
1
3
4
6
2
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-parteii-arraylist/
Descargar

Diapositiva 1