2012-02-16 17 views
5

que quería saber el comportamiento de std::vector::reserve() en las situaciones siguientes:Comportamiento del método de reserva de vector()

  1. Supongamos reserve(N) se llama varias veces uno tras otro inmediatamente. ¿Se agregará o sobrescribirá el anterior reserve(N1)?
  2. Si el anterior reserve(N1) se sobrescribe con la última llamada, , ¿qué ocurre si el último reserve(Nn) exige menos ranuras?
  3. Después de declarar vector si tenemos simplemente push_back() elementos X, y luego llamamos reserve(N). ¿Los elementos ya push_back() X cuentan en N?
  4. Supongamos que, si el vector tiene algunos elementos de X empujado y ahora si push_back() 1 elemento más (X + 1), entonces ese objeto tendríamos que conseguir reubicado; pero aún no hemos realizado push_back(). ¿Qué ocurre si llamamos al reserve() ahora? ¿Se reubicará el objeto inmediatamente? Si no, ¿cómo se reserva el espacio?
+0

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. –

Respuesta

11

reserve() simplemente se asegura de que la memoria asignada del vector es al menos lo suficientemente grande como para contener el número de artículos pasados ​​como argumento. Por lo tanto ...

  1. Cualquiera que sea el valor máximo de todos los aprobados será la capacidad resultante mínima efectivamente reservada.
  2. Ver # 1.
  3. Sí.
  4. El vector asigna tanta memoria cuando se llama a reserve() como sea necesario para almacenar el número de elementos pasados ​​a reserve().

Para citar el estándar actual:

void reserve(size_type n) 

Si n es menor o igual a capacity(), esta llamada no tiene ningún efecto. De lo contrario, es una solicitud de asignación de memoria adicional. Si la solicitud es exitosa, entonces capacity() es mayor o igual que n; de lo contrario, capacity() no ha cambiado. En cualquier caso, size() es sin cambios.

+1

+1 También es importante tener en cuenta que si se produce una reasignación ('n'>' capacity() '); los iteradores, punteros y referencias a ese vector serán invalidados. Con esto en mente, 'reserve()' es especialmente útil para * prevenir una reasignación * (y por lo tanto la invalidación de iteradores, etc.) cuando se llama a 'push_back()'. – netcoder

+2

# 1 es inexacto: tener _al menos_ tanto como 'reserva()' significa que la _capacidad_ resultante (¡no el tamaño!) Podría ser mayor que la llamada a 'reserva()' con la solicitud más grande. – wilhelmtell

+0

Editado "tamaño resultante" -> "tamaño mínimo resultante". – Amber

3

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().

+0

Buena respuesta ... ya +1 a ambas respuestas. – iammilind

Cuestiones relacionadas