vectors program example c++ vector

program - function vector c++



Elección entre vector:: resize() y vector:: reserve() (4)

¡Las dos funciones hacen cosas muy diferentes!

El método resize() (y el paso del argumento al constructor es equivalente a eso) insertará o eliminará el número apropiado de elementos para el vector para que tenga el tamaño dado (tiene un segundo argumento opcional para especificar su valor). Afectará el size() , la iteración recorrerá todos esos elementos, push_back se insertará después de ellos y podrá acceder directamente a ellos utilizando el operator[] .

El método reserve() solo asigna memoria, pero la deja sin inicializar. Solo afecta la capacity() , pero el size() cambiará. No hay ningún valor para los objetos, porque no se agrega nada al vector. Si luego inserta los elementos, no se realizará ninguna reasignación, ya que se realizó por adelantado, pero ese es el único efecto.

Entonces depende de lo que quieras. Si desea una matriz de 1000 elementos predeterminados, use resize() . Si desea una matriz a la que espera insertar 1000 elementos y desea evitar un par de asignaciones, use reserve() .

EDITAR: El comentario de Blastfurnace me hizo leer la pregunta nuevamente y darse cuenta de que en su caso la respuesta correcta es no preasignar manualmente. Solo sigue insertando los elementos al final según lo necesites. El vector se reasignará automáticamente según sea necesario y lo hará de manera más eficiente que la manera manual mencionada. El único caso donde reserve() tiene sentido es cuando tiene una estimación razonablemente precisa del tamaño total que necesitará fácilmente disponible con anticipación.

EDIT2: edición de pregunta de anuncio: si tiene una estimación inicial, reserve() esa estimación. Si resulta que no es suficiente, solo deja que el vector lo haga.

Estoy pre asignando algo de memoria a mi variable miembro de vector . El siguiente código es una parte mínima

class A { vector<string> t_Names; public: A () : t_Names(1000) {} };

Ahora en algún punto del tiempo, si el t_Names.size() es igual a 1000 . Tengo la intención de aumentar el tamaño en 100 . Entonces, si llega a 1100 , de nuevo aumenta en 100 y así sucesivamente.

Mi pregunta es, qué elegir entre vector::resize() y vector::reserve() . ¿Hay alguna mejor opción en este tipo de escenario?

Editar : Tengo una especie de estimación precisa para los t_Names . Estimo que es alrededor de 700 a 800 . Sin embargo, en ciertas situaciones (raras), puede crecer más de 1000 .


Según su descripción, parece que desea "reservar" el espacio de almacenamiento asignado de vectores t_Names.

Tenga en cuenta que el resize inicializa el vector recién asignado donde reserve solo asigna pero no construye. Por lo tanto, ''reserva'' es mucho más rápido que ''cambiar el tamaño''

Puede consultar la documentación sobre la diferencia de resize y reserve


reserve cuando no desee que los objetos se inicialicen cuando estén reservados. Además, es posible que prefiera diferenciar lógicamente y realizar un seguimiento de su recuento en función de su recuento de uso cuando cambie el tamaño. por lo tanto, hay una diferencia de comportamiento en la interfaz: el vector representará el mismo número de elementos cuando se reserve, y tendrá 100 elementos más grandes cuando se cambie el tamaño en su escenario.

¿Hay alguna mejor opción en este tipo de escenario?

depende completamente de tus objetivos cuando se combate el comportamiento predeterminado. algunas personas favorecerán los asignadores personalizados, pero realmente necesitamos una mejor idea de qué es lo que está tratando de resolver en su programa para asesorarlo bien.

Sin embargo, muchas implementaciones de vectores simplemente doblarán el recuento de elementos asignados cuando deban crecer: ¿está tratando de minimizar los tamaños máximos de asignación o está tratando de reservar suficiente espacio para algún programa sin candado u otra cosa?


resize() no solo asigna memoria, sino que crea tantas instancias como el tamaño deseado que pase para resize() como argumento. Pero reserve() solo asigna memoria, no crea instancias. Es decir,

std::vector<int> v1; v1.resize(1000); //allocation + instance creation cout <<(v1.size() == 1000)<< endl; //prints 1 cout <<(v1.capacity()==1000)<< endl; //prints 1 std::vector<int> v2; v2.reserve(1000); //only allocation cout <<(v2.size() == 1000)<< endl; //prints 0 cout <<(v2.capacity()==1000)<< endl; //prints 1

Salida ( demostración en línea ):

1 1 0 1

Así que resize() puede no ser deseable, si no desea los objetos creados por defecto. También será lento. Además, si push_back() elementos nuevos, el size() del vector aumentará aún más al asignar nueva memoria (lo que también significa mover los elementos existentes al espacio de memoria recientemente asignado). Si usó reserve() al inicio para asegurarse de que ya hay suficiente memoria asignada, el size() del vector aumentará cuando lo push_back() , pero no asignará nueva memoria hasta que se agote. espacio que reservaste para ello .