Vectores vs Listas

Iniciado por amchacon, 1 Junio 2013, 13:39 PM

0 Miembros y 1 Visitante están viendo este tema.

amchacon

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?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

BlackM4ster

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í
- Pásate por mi web -
https://codeisc.com

amchacon

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).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

xiruko

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!

amchacon

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 favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

xiruko

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.

amchacon

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).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

xiruko

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!

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

amchacon

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?)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar