Autor
|
Tema: Vectores vs Listas (Leído 5,480 veces)
|
amchacon
Desconectado
Mensajes: 1.211
|
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?
|
|
|
En línea
|
|
|
|
BlackM4ster
Desconectado
Mensajes: 499
Error, el teclado no funciona. Pulse F1 para continuar
|
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í
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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).
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
Yo usaría una cola circular, es sencillo y muy práctico. disparos[MAX]; int in=0, out=0; Cuando la nave dispara: 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!
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Parece eficiente y práctico, pero: 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. Quieres decir que la variable in pasaría a 0. Pero entonces te cargas el bucle de comprobación
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
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.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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).
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
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!
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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? 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
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.211
|
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?)
|
|
|
En línea
|
|
|
|
|
|