Puede ser ... especialmente si va a agregar muchos elementos a su vector en el tiempo, y desea evitar la expansión de memoria automática que el contenedor hará cuando se agote el espacio disponible.
por ejemplo, copias de inserciones (es decir, std::vector::push_back
) se consideran una ammortized O (1) o de constante de tiempo de proceso, pero eso es porque si se realiza una inserción en la parte posterior de un vector, y el vector está fuera del espacio, debe reasignar memoria para una nueva matriz de elementos, copiar los elementos antiguos en la nueva matriz y luego copiar el elemento que intenta insertar en el contenedor. Ese proceso es O (N), o complejidad de tiempo lineal, y para un vector grande, podría tomar bastante tiempo. El uso del método reserve()
le permite preasignar la memoria para el vector si sabe que va a tener al menos cierto tamaño, y evita reasignar la memoria cada vez que se agota el espacio, especialmente si va a hacer una inserción hacia atrás dentro de algún código de rendimiento crítico en el que desea asegurarse de que el tiempo para realizar la inserción siga siendo un proceso de complejidad O (1) real y no incurra en una reasignación de memoria oculta para la matriz. De acuerdo, tu constructor de copia tendría que ser O (1) también complejo para obtener una verdadera complejidad O (1) para todo el proceso de inserción posterior, pero con respecto al algoritmo real para la inserción posterior en el vector por el propio contenedor , puede mantener una complejidad conocida si la memoria de la ranura ya está preasignada.
Gracias a todos por la respuesta. Además, ¿usar la reserva (20) significa que ahora hay 20 elementos o solo que se ha asignado la memoria para 20 elementos? –
Solo se ha asignado la memoria. La memoria no está inicializada. – Jason
'reserva()' agrega capacidad, pero no agrega elementos. Lo que devuelve 'size()' no cambiará (sin embargo, 'capacity()' devolverá al menos 20 en tu ejemplo). –