Tenemos el siguiente caso, necesitamos tener almacenados los disparos de una nave. Cada cierto tiempo comprobaremos los disparos y si alguno ha acertado/salido del mapa los eliminaremos.
¿Que contenedor deberíamos usar para obtener el máximo rendimiento? ¿Vectores o listas?
mm yo lo haría con una clase disparo
un struc con las variables de posicion -> disparo[50]
y luego un for que los recorra
Yo siempre lo hago así
Cita de: Black Master en 1 Junio 2013, 14:03 PM
mm yo lo haría con una clase disparo
un struc con las variables de posicion -> disparo[50]
y luego un for que los recorra
Yo siempre lo hago así
El problema esque no conoces cuantos disparos hay en la pantalla, es un número que varía. Además no es muy óptimo porque no puedes borrar los disparos que has realizado (por lo cual, estarías comprobando disparos vacíos en el for).
Por eso digo de usar la clase vector/lista. Pero no sabría escoger cual es la más idonea (hasta ahora he usado lista).
Yo usaría una cola circular, es sencillo y muy práctico.
disparos[MAX];
int in=0, out=0;
Cuando la nave dispara:
disparos[in++]=loquesea;
Cuando quieres comprobar los disparos que una nave tiene pendiente:
while (out != in) ComprobarDisparo(disparos[out++]);
Acuérdate que entonces tendrías que comprobar que los indicies no han sobrepasado la dimensión del vector. Lo puedes hacer con un if siempre que leas o escribas algo en 'disparos', o sino puedes jugar con el tamaño de las variables tipo:
disparos[256];
unsigned char in=0, out=0;
De tal manera que los índices al llegar al 255 y sumarle uno, directamente pasan a 0 y empezarías a sobreescribir disparos antiguos que en teoría ya habrás procesado.
Espero que te sirva, un saludo!
Parece eficiente y práctico, pero:
CitarDe tal manera que los índices al llegar al 255 y sumarle uno, directamente pasan a 0 y empezarías a sobreescribir disparos antiguos que en teoría ya habrás procesado.
Quieres decir que la variable in pasaría a 0. Pero entonces te cargas el bucle de comprobación :silbar:
Por que te lo cargas?
while (in != out) ComprobarDisparo(disparos[out++]);
Si 'in' ha pasado por ejemplo a 3, y 'out' está en 255, al sumarle uno a 'out' este pasa a 0. Como los índices siguen siendo distintos, se seguirá en el bucle hasta que los índices sean iguales.
Cita de: xiruko en 1 Junio 2013, 14:50 PM
Por que te lo cargas?
while (in != out) ComprobarDisparo(disparos[out++]);
Si 'in' ha pasado por ejemplo a 3, y 'out' está en 255, al sumarle uno a 'out' este pasa a 0. Como los índices siguen siendo distintos, se seguirá en el bucle hasta que los índices sean iguales.
Te lo explico. Supon que tienes cinco disparos, in valdría 5, por lo que el bucle hará 5 comprobaciones. Cuando se vuelva a ejecutar el bucle, out debe reinicializarse a 0, de lo contrario dejarías de comprobar esos 5 cinco disparos.
Partiendo de eso, cuando in pase de 255 a 0, dejará sin comprobar los disparos 255,254,253... De hecho el bucle no se llegará ni a ejecutar (in = out).
Vale ahora lo he entendido, no solo hay que procesar los disparos sino que si no han impactado o salido del mapa no se deben borrar y por lo tanto se deben volver a comprobar más tarde.
Me he levantado hace poco y estoy algo espeso... xD
A ver si luego doy con alguna idea y te comento.
Un saludo!
Cita de: amchacon en 1 Junio 2013, 13:39 PMnecesitamos tener almacenados los disparos de una nave. Cada cierto tiempo comprobaremos los disparos y si alguno ha acertado/salido del mapa los eliminaremos.
¿Que contenedor deberíamos usar para obtener el máximo rendimiento? ¿Vectores o listas?
Los vectores te permiten un acceso constante y las listas una inserción/eliminación tan eficiente como sea posible. Elegir uno u otro depende de la operación mas frecuente (búsqueda, inserción en orden, eliminación, etc.).
Un saludo
Cita de: rir3760 en 1 Junio 2013, 16:45 PM
Los vectores te permiten un acceso constante y las listas una inserción/eliminación tan eficiente como sea posible. Elegir uno u otro depende de la operación mas frecuente (búsqueda, inserción en orden, eliminación, etc.).
Eso es lo que te pregunto (en este caso que escogerías?)
Cita de: amchacon en 1 Junio 2013, 20:40 PM
Eso es lo que te pregunto (en este caso que escogerías?)
Yo me decanto por vector, de la librería vector que contiene con sus funciones incorporadas casi todo lo que exiges: añadir, añadir en una cierta posición,quitar, ordenar, desordenar , cambiar tamaño y así hasta 31 funciones ya listas ara ser usadas a la carta. También me influye el que veo las listas demasiado enrevesadas para programarlas desde que queremos añadirle las funcionalidades que de forma natural proporciona la clase vector. Es mi humilde opinión.
Saluditos!. .... ..(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Cita de: leosansan en 2 Junio 2013, 07:06 AMTambién me influye el que veo las listas demasiado enrevesadas para programarlas desde que queremos añadirle las funcionalidades que de forma natural proporciona la clase vector.
C++ incluye también una clase lista que ofrece
las mismas funciones que la clase vector
Bueno miento, el operador [] no está pero tampoco hace falta porque recorro el contenedor entero, no necesito acceder a posiciones aleatorias.
Cita de: amchacon en 2 Junio 2013, 10:15 AM
C++ incluye también una clase lista que ofrece las mismas funciones que la clase vector
Bueno miento, el operador [] no está pero tampoco hace falta porque recorro el contenedor entero, no necesito acceder a posiciones aleatorias.
Gracias por la información, en C++ ando escasito de conocimiento aún, pero todo se andará.
Y como habrás notado, los códigos que realmente me atraen son especialmente los numéricos, supongo que por deformación profesional. De ahí que esté estirando el tema de la matriz de 10x10 como un chicle, le estoy sacando el jugo en forma de game a algo que inicialmente era pura cálculo. Digo esto último por la ingeniosa forma que se me ocurrió para generar los aleatorios entre uno y mil sin que se repitieran.
Saluditos!. ....Y como buen Leo me despido a lo grande:(http://smilies-gifs.com/emoticonos-grandes/1grandes.gif)
Cita de: leosansan en 2 Junio 2013, 11:27 AMGracias por la información, en C++ ando escasito de conocimiento aún, pero todo se andará.
¡De nada! Te dejo la referencia:
http://www.cplusplus.com/reference/list/list/
Pero el uso es idéntico a los vectores, solo hay que sustituir vector -> list y hacer el include:
#include <list>
Como no tienes el operador []. Para recorrer una lista tienes que usar un iterador:
list<int> MiLista;
// Relleno la lista
for (int i = 0; i < 100;i++)
MiLista.push_back(i);
// La muestro por pantalla
for (list<int>::iterator it = MiLista.begin(); it != MiLista.end();it++)
{
cout<<*it<<endl;
}
Cita de: amchacon en 2 Junio 2013, 12:02 PM
¡De nada! Te dejo la referencia:
http://www.cplusplus.com/reference/list/list/
Pero el uso es idéntico a los vectores, solo hay que sustituir vector -> list y hacer el include:
#include <list>
Como no tienes el operador []. Para recorrer una lista tienes que usar un iterador:
list<int>MiLista;
// Relleno la lista
for (int i = 0; i < 100;i++)
MiLista.push_back(i);
// La muestro por pantalla
for (list<int>::iterator it = MiLista.begin(); it != MiLista.end();it++)
{
cout<<*it<<endl;
}
Thanks, muchas thanks, creía que iba ser un tromento como las listas de C, todas llenas de punetros que al final no sabes ni adonde apunta los punteros y las flechas. :laugh: :laugh: :laugh:. Ahora me meteré de lleno con ese tema, me has quitado el miedo a otro rollo batatero.
Saluditos y gracia nuevamente!. .... ..(http://st.forocoches.com/foro/images/smilies/simba1.gif)
Bueno ya que estoy, te digo más cosas de las listas.
Las listas no siguen un orden lineal, asi que pueden manipularse sus posiciones sin problemas. Por ello tenemos algunos elementos nuevos:
- Sort: Ordena los elementos de una lista de menor a mayor:
list<int>MiLista;
// Relleno la lista
for (int i = 0; i < 100;i++)
MiLista.push_back(rand());
// Ordeno la lista
MiLista.sort();
// La muestro por pantalla
for (list<int>::iterator it = MiLista.begin(); it != MiLista.end();it++)
{
cout<<*it<<endl;
}
- remove: Borra todos los elementos con un valor específico:
list<int>MiLista;
// Relleno la lista
for (int i = 0; i < 100;i++)
MiLista.push_back(rand());
// ¡Elimino los ceros!
MiLista.remove(0);
// La muestro por pantalla
for (list<int>::iterator it = MiLista.begin(); it != MiLista.end();it++)
{
cout<<*it<<endl;
}
- unique: Elimina los elementos repetidos.
Te dejo los vídeos con los que aprendí a usar listas:
http://minidosis.org/C++/Listas/
¡Saludillos!
Cita de: amchacon en 2 Junio 2013, 12:30 PM
Bueno ya que estoy, te digo más cosas de las listas.
.....................................
Gracias nuevamente, dedicaré unos días a empollarme el tema, parece interesante. Aunque visto a bote pronto es casi como la clase vector, de entrada parecen muy semejantes. Pero, en fin,supongo que según profundice en el tema veré mejor las diferencias y bondades de cada método.
Saluditos campeón !... ...(http://st.forocoches.com/foro/images/smilies/dancer2.gif)
Cita de: leosansan en 2 Junio 2013, 13:58 PM
Gracias nuevamente, dedicaré unos días a empollarme el tema, parece interesante. Aunque visto a bote pronto es casi como la clase vector, de entrada parecen muy semejantes. Pero, en fin,supongo que según profundice en el tema veré mejor las diferencias y bondades de cada método.
Sí, son muy parecidas. La mayor diferencia es el rendimiento de las operaciones:
Insertar un elemento al final- Listas: Rápido, solo tiene que reservar un nuevo espacio en la memoria y enlazarlo con la última lista.
- Vector: Velocidad moderada, tiene que intentar hacer un realloc, si hay más espacio contiguo en la memoria no hay problema pero si no lo hay tendrá que mover todos los elementos a una nueva posición.
Acceso a una posición aleatoria- Listas: Lento, tiene que ir recorriendo toda la lista hasta llegar al elemento en cuestión.
- Vector: Muy rápido.
Borrar un elemento aleatorio- Listas: Rápido, simplemente elimina el elemento y ajusta los punteros.
- Vector: Lento, tiene que reorganizar los datos para que sigan estando contiguos en la memoria.
Inserción aleatoria- Listas: Rápido, añade el nuevo elemento y ajusta los punteros.
- Vector: Lento, tiene que desplazar todos los elementos para dejar espacio al nuevo elemento.
Básicamente, los vectores ganan en acceso aleatorio y las listas ganan en inserción/borrado aleatorio.
Cita de: amchacon en 2 Junio 2013, 14:16 PM
Sí, son muy parecidas. La mayor diferencia es el rendimiento de las operaciones:
................................................
Básicamente, los vectores ganan en acceso aleatorio y las listas ganan en inserción/borrado aleatorio.
Por lo que veo verifican las mismas características que existen en C entre los arrays y las listas, lo cual me confirma en la idea de que la clase lista en C++ es una implementación de todas aquellas funciones/operaciones que en C hay que hacer "a mano" a través de punteros. Sin duda una comodidad a favor de C++ sobre todo porque yo aún me lío con el uso de los puteros en las listas.
Gracias otra vez por la información tan clara y puntual que me ofreces.
Saluditos!. .... ..(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)