Supongamos reserve(N)
se llama varias veces uno tras otro inmediatamente. ¿Se sumará o sobrescribirá el anterior reserve(N1)
?
A diferencia std::string
no es posible llamar reserve()
para std::vector
para reducir el capacity()
.Calling reserve()
con un argumento que es menor que la corriente capacity()
es un no-op.Por lo tanto, la última llamada reserve()
que aumenta la capacidad actual se mantendrá.
Si el anterior reserve(N1)
se sobreescribe con la última llamada, entonces, ¿qué ocurre si la última reserve(Nn)
demanda menos cantidad de slots?
Calling reserve()
con un argumento que es menor que la corriente capacity()
es un no-op.
Después de declarar el vector si solo tenemos elementos push_back() X, y luego llamamos a reserva (N). ¿Los elementos de push_back() X contarán en N?
reserve()
solo asigna suficiente cantidad de elementos para que sí. Tenga en cuenta que después de llamar al reserve()
solo se cambia el capacity()
del vector, size()
no se ve afectado. Si necesita crear tantos elementos y no solo reservar memoria, debe usar resize()
.
Supongamos que, si el vector tiene algunos elementos X
empujado y ahora si push_back()
1 elemento más (X+1)
, entonces ese objeto tendría que obtener reubicado; pero aún no hemos realizado push_back()
. ¿Qué pasa si llamamos al reserve()
ahora? ¿El objeto se reubicará de inmediato? Si no, ¿cómo se reserva el espacio?
Sí, la reubicación ocurrirá pero depende. Como se dijo anteriormente, reserve()
asigna suficiente memoria para almacenar tantos elementos como el argumento le haya pasado. Entonces, si este número de elementos es mayor que el que puede acomodarse en el vector actual capacity()
, se producirá la reubicación.
referencias estándar:
C++ 03 23.2.4.2 capacidad vector [lib.vector.capacity]
void reserve(size_type n);
Efectos: una directiva que informa a un vector de una cambio planificado de tamaño, para que pueda administrar la asignación de almacenamiento en consecuencia. Después de reserve()
, capacity()
es mayor o igual que el argumento de reserva si ocurre la reasignación; e igual al valor anterior de capacity()
de lo contrario. La reasignación ocurre en este punto si y solo si la capacidad actual es menor que el argumento de reserve()
.
Complejidad: No cambia el tamaño de la secuencia y toma como máximo tiempo lineal en el tamaño de la secuencia.
Lanza: length_error si n > max_size()
.248)
Notas: Reasignación invalida todas las referencias, los punteros, y los iteradores que se refieren a los elementos de la secuencia.Se garantiza que no se realizará ninguna reasignación durante las inserciones que se produzcan después de una llamada al reserve()
hasta el momento en que una inserción haría que el tamaño del vector fuera mayor que el tamaño especificado en la llamada más reciente al reserve()
.
Si no tiene una copia del manual a la mano, hay [múltiples] (http://www.sgi.com/tech/stl/Vector.html) [referencias] (http: // en.cppreference.com/w/cpp/container/vector/reserve) en línea. –