es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Velocidades de un Vector 3D versus un Array 3D de tamaño variable

Estoy diseñando una caja de daño dinámica para los personajes en un juego basado en texto, que registra las ubicaciones de los golpes (o fallos) de un arma lanzada hacia ellos. A continuación, la ubicación (índices) y el daño (magnitud) de los golpes se traducen en disminuciones en las variables de salud correspondientes de las extremidades de un personaje. Creo que lo mejor sería implementar esta caja de daño utilizando una clase con algún miembro en forma de vector/matriz 3D.

Naturalmente, es posible que desee tener dimensiones variables del contenedor 3D para diferentes tamaños de enemigo, pero soy consciente de que generalmente el tamaño se determina al inicializarlo. Entonces, aquí está mi pregunta:

¿Sería más eficiente utilizar un arreglo dinámico en estilo C, cuyo tamaño pueda decidir y asignar dentro de un constructor parametrizado, como se muestra a continuación?

class hurtBox {
 private:
   int ***hurtBoxMatrix;
 public:
   hurtBox(int l, int w, int h) {
     hurtBoxMatrix = new int**[l];
     for (int i = 0; i < l; i++) {
       hurtBoxMatrix[i] = new int*[w];
       for (int j = 0; j < w; j++) {
         hurtBoxMatrix[i][j] = new int[h] ();
       }
     }
   }
};

O, ¿sería suficiente utilizar un vector en el que se inserten elementos hasta las dimensiones deseadas?

class hurtBox {
 private:
   vector<><><int>>> hurtBoxMatrix;
 public:
   hurtBox(int l, int w, int h) {
     for (int i = 0; i < l; i++) {
       hurtBoxMatrix.push_back(vector<><int>>);
       for (int j = 0; j < w; j++) {
         hurtBoxMatrix[i].push_back(vector<int>);
         for (int k = 0; k < h; k++) {
           hurtBoxMatrix[i][j].push_back(0);
         }
       }
     } 
   }
};

Imagino que la primera opción es mejor, ya que esa primera asignación es de tiempo constante, ¿verdad? ¿Existe alguna manera de hacer esto mejor que cualquiera de estas opciones?

Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en C++, rendimiento, matrices multidimensionales, gestión de memoria y complejidad temporal, mi recomendación sería utilizar una matriz dinámica de estilo C con el tamaño determinado por los parámetros pasados al constructor. Este enfoque permite una asignación de memoria más eficiente, ya que el tamaño está predeterminado y se puede realizar en tiempo constante. Por otro lado, el uso de un vector puede requerir asignación y reasignación de memoria adicional a medida que se agregan elementos al contenedor.

    Dicho esto, tenga en cuenta que la elección entre una matriz de estilo C y un vector depende de los requisitos específicos de su aplicación. Si prevé cambiar con frecuencia las dimensiones del contenedor, un vector puede ser más adecuado, ya que permite el redimensionamiento dinámico.

    En términos de optimización, también podría considerar el uso de un bloque de memoria continuo para almacenar la matriz multidimensional, lo que puede mejorar la localidad de caché y reducir la fragmentación de memoria. En general, la elección entre una matriz de estilo C y un vector debe basarse en las necesidades específicas de su aplicación y los compromisos entre flexibilidad, rendimiento y uso de memoria.

Comments are closed.