Grande el vídeo. No sabia que se podia usar el 'using' de esa manera. Si que falta la función 'emplace_back' pero bueno, que hagan los deberes xD. Gracias por el vídeo. P.D.: La cámara me parece que está mejor en esta posición que en la anterior. La terminal se ve mucho más clara.
Esto no lo sabía, ha sido un dataso para mí, la lección es que es mucho mejor reservar desde el principio un tamaño estimado en vez de dejar que el vector crezca cada vez que hacemos un push, ya que nos ahorramos el costo que significa reservar, copiar y eliminar, pero también me surge una pregunta, ¿vector tiene un método para eliminar los espacios extra que genera el crecimiento geométrico?
¿A qué te refieres exactamente con "eliminar los espacios extra que genera el crecimiento geométrico"? Técnicamente, cuando un vector no tiene más espacio disponible y añadimos un nuevo elemento, se dobla el espacio disponible y luego se añade el elemento. Ese espacio nuevo que queda disponible está pensado para que sigas añadiendo elementos. Si ese espacio lo "eliminas", entonces forzarás a que repita el comportamiento de (1) reservar doble espacio -> (2) copiar todos los elementos -> (3) eliminar espacio anterior -> (4) añadir el nuevo elemento, en cuanto añadas el próximo elemento. Si, por algún motivo, ya sabes que no vas a necesitar más espacio, quizá te interese más tener el espacio fijo desde un inicio y usar un std::array en vez de un std::vector. Aún así, si es a esto a lo que te refieres, tienes un método llamado shrink_to_fit() que descarta el espacio disponible al final de vector, dejándolo sólo con el espacio que ocupan sus elementos ( en.cppreference.com/w/cpp/container/vector/shrink_to_fit ). Sin embargo, cuidado con el método en concreto, porque tiene costes asociados como reservar un nuevo espacio que sea el justo y necesario y mover todos los elementos ahí.
No sé si es el objetivo de la asignatura, pero pongo un pequeño aporte al video para los más curiosos. Costes asintóticos : baptiste-wicht.com/posts/2012/11/cpp-benchmark-vector-vs-list.html Magistral video, gracias!
No es particularmente el objetivo de la asignatura, pero es una información tremendamente valiosa en ingeniería en general. Por supuesto, mis estudiantes están aquí para obtener un título de ingeniería, por lo que ver un análisis como este y entender cómo realizar correctamente pruebas y obtener resultados es crucial. Muy buen aporte. Muchas gracias Victor.
Me ha encantado, lo que se aprende aquí no tiene precio... pero me pregunto: no se podría reservar la memoria desde el constructor, si pones algo asi?¿: vector myVector(1000, valor),(cambiando a la clase que corresponda obviamente), estoy "rellenando" 1000 casillas con un valor como si usas .reserve?¿
Puedes mirar los constructores de std::vector en cppreference www.cplusplus.com/reference/vector/vector/vector/ . Los constructores desde c++11 te permiten construir un vector con n valores, copiando a partir de otro, moviendo a partir de otro, o a partir de una lista de inicializadores. Incluso puedes darle un allocator, como a cualquier contenedor de la STL, para poder usar placement new, y poner la memoria que reserve donde tú quieras. Sin embargo, ninguno de ellos te permite ampliar el capacity de base, como si hicieras un reserve. Eso, de momento, se hace llamando a reserve.
@@ProfesorRetroman Muchas Gracias por responder y la info. Por otro lado comentarte que la posición de la cámara se agradece, en otros vídeos a veces no se ve demasiado bien la proyección.
Sí, estuve pensando como mejorar la posición de la cámara y se me ocurrió una forma. Aunque a mi se me ve menos y no miro a la cámara, creo que se ve bien lo que realmente importa, que es el contenido. Seguramente la mantendré
Antes debería decirte que en vídeos siguientes se responde a la pregunta con detalle (y se cuentan más cosas al respecto). También es importante que sepas que puedes responderla fácilmente tú mismo: pon un cout en el constructor, y otro en un constructor de copia de GameObject y sabrás cuántas veces se llama a cada uno. Cuando hagas eso, verás que se llama al constructor de GameObject (lo que lo construye en la pila, como objeto local) y después al constructor de copia (para copiar el objeto local a la memoria reservada en el heap para el vector). Es mejor que estas pruebas las hagas tú mismo, así podrás responder muchas más preguntas de las que yo pueda contestarte ;)
Muchas gracias por tus videos, explicas bien y encima explicas cosas que nadie suele explicar
Me ha quedado mucho más claro como trabajar con std::vector y me has descubierto cosas como el reserve, muchas gracias.
muy ilustrativo, ahora tengo un mayor entendimiento acerca de los std::vector
que calidad de conocimiento, gracias por compartir su conocimiento ingeniero...
Excelente profesor, recien descubro este canal, uy pero que explicacion y enseñanza la mejor pero por lejos
Clase Magistral! Que buen canal me ha salido en recomendados 💯💯👨🏻💻
Estos si son videos de calidad! 👍
¡Qué genial!, muy agradecido.
Magistral como siempre
magnífico, como siempre!
Grande el vídeo. No sabia que se podia usar el 'using' de esa manera. Si que falta la función 'emplace_back' pero bueno, que hagan los deberes xD.
Gracias por el vídeo.
P.D.: La cámara me parece que está mejor en esta posición que en la anterior. La terminal se ve mucho más clara.
Esto no lo sabía, ha sido un dataso para mí, la lección es que es mucho mejor reservar desde el principio un tamaño estimado en vez de dejar que el vector crezca cada vez que hacemos un push, ya que nos ahorramos el costo que significa reservar, copiar y eliminar, pero también me surge una pregunta, ¿vector tiene un método para eliminar los espacios extra que genera el crecimiento geométrico?
¿A qué te refieres exactamente con "eliminar los espacios extra que genera el crecimiento geométrico"? Técnicamente, cuando un vector no tiene más espacio disponible y añadimos un nuevo elemento, se dobla el espacio disponible y luego se añade el elemento. Ese espacio nuevo que queda disponible está pensado para que sigas añadiendo elementos. Si ese espacio lo "eliminas", entonces forzarás a que repita el comportamiento de (1) reservar doble espacio -> (2) copiar todos los elementos -> (3) eliminar espacio anterior -> (4) añadir el nuevo elemento, en cuanto añadas el próximo elemento. Si, por algún motivo, ya sabes que no vas a necesitar más espacio, quizá te interese más tener el espacio fijo desde un inicio y usar un std::array en vez de un std::vector. Aún así, si es a esto a lo que te refieres, tienes un método llamado shrink_to_fit() que descarta el espacio disponible al final de vector, dejándolo sólo con el espacio que ocupan sus elementos ( en.cppreference.com/w/cpp/container/vector/shrink_to_fit ). Sin embargo, cuidado con el método en concreto, porque tiene costes asociados como reservar un nuevo espacio que sea el justo y necesario y mover todos los elementos ahí.
No sé si es el objetivo de la asignatura, pero pongo un pequeño aporte al video para los más curiosos.
Costes asintóticos : baptiste-wicht.com/posts/2012/11/cpp-benchmark-vector-vs-list.html
Magistral video, gracias!
No es particularmente el objetivo de la asignatura, pero es una información tremendamente valiosa en ingeniería en general. Por supuesto, mis estudiantes están aquí para obtener un título de ingeniería, por lo que ver un análisis como este y entender cómo realizar correctamente pruebas y obtener resultados es crucial. Muy buen aporte. Muchas gracias Victor.
gracias profe, optimizador de la lechita jajaja
Hola Profesor, ahí te dejo el Me Gusta
Pues nada, a rediseñar y replantearme todos los vectores que tengo :)
Me ha encantado, lo que se aprende aquí no tiene precio... pero me pregunto:
no se podría reservar la memoria desde el constructor, si pones algo asi?¿:
vector myVector(1000, valor),(cambiando a la clase que corresponda obviamente),
estoy "rellenando" 1000 casillas con un valor como si usas .reserve?¿
Puedes mirar los constructores de std::vector en cppreference www.cplusplus.com/reference/vector/vector/vector/ . Los constructores desde c++11 te permiten construir un vector con n valores, copiando a partir de otro, moviendo a partir de otro, o a partir de una lista de inicializadores. Incluso puedes darle un allocator, como a cualquier contenedor de la STL, para poder usar placement new, y poner la memoria que reserve donde tú quieras. Sin embargo, ninguno de ellos te permite ampliar el capacity de base, como si hicieras un reserve. Eso, de momento, se hace llamando a reserve.
@@ProfesorRetroman Muchas Gracias por responder y la info.
Por otro lado comentarte que la posición de la cámara se agradece, en otros vídeos a veces no se ve demasiado bien la proyección.
Sí, estuve pensando como mejorar la posición de la cámara y se me ocurrió una forma. Aunque a mi se me ve menos y no miro a la cámara, creo que se ve bien lo que realmente importa, que es el contenido. Seguramente la mantendré
Estaría muy bien poder escuchar lo que dicen los alumnos. El resto absolutamente genial. Gracias por compartir tu conocimiento :)
buenas, podrias decirme la respuesta de 15:48?
Antes debería decirte que en vídeos siguientes se responde a la pregunta con detalle (y se cuentan más cosas al respecto). También es importante que sepas que puedes responderla fácilmente tú mismo: pon un cout en el constructor, y otro en un constructor de copia de GameObject y sabrás cuántas veces se llama a cada uno. Cuando hagas eso, verás que se llama al constructor de GameObject (lo que lo construye en la pila, como objeto local) y después al constructor de copia (para copiar el objeto local a la memoria reservada en el heap para el vector).
Es mejor que estas pruebas las hagas tú mismo, así podrás responder muchas más preguntas de las que yo pueda contestarte ;)
@@ProfesorRetroman muchas gracias!!!