2012-05-06 11 views
5

No puedo encontrar esta información. Estoy lidiando con una situación extraña aquí donde estoy dentro de un ciclo y puedo obtener información aleatoria en cualquier momento. Esta información debe almacenarse en un vector. Ahora cada cuadro tengo que establecer este vector para asegurarme de que no voy a ejecutar el espacio (estoy escribiendo valores en puntos aleatorios en el vector usando indexación).Tamaño de vector de STL

Suponiendo que no hay forma de cambiar este código, quiero saber si el vector "ignora" la función resize() si envío un argumento que sea exactamente del tamaño del vector. ¿Dónde puedo encontrar esta información?

Respuesta

9

De referencia MSDN 1

Si el tamaño del recipiente es menor que el tamaño solicitado, _Newsize, los elementos se añaden al vector hasta que alcanza el tamaño solicitado. Si el tamaño del contenedor es mayor que el tamaño solicitado, los elementos más cercanos al extremo del contenedor se eliminan hasta que el contenedor alcance el tamaño _Newsize. Si el tamaño actual del recipiente es el mismo que el tamaño solicitado, se toma ninguna acción

La ISO C++ estándar (página 485 2) especifica este comportamiento para vector::resize

void resize (size_type sz , T c = T()); 

if (sz > size()) 
    insert (end() , sz - size() , c); 
else if (sz < size()) 
    erase (begin()+ sz , end()); 
else 
; // Does nothing 

Entonces, sí, el vector lo ignora y no es necesario que realice una comprobación por su cuenta.

0

Kinda-sorta.

El simple cambio de tamaño de un vector con resize() solo puede dar como resultado que el vector use más memoria (cambiará la cantidad que utilizan sus elementos). Si no hay espacio suficiente en el espacio reservado, se reasignará (y a veces les gusta rellenarse un poco así que incluso si es posible que crezcan). Si ya hay suficiente espacio para el tamaño solicitado y el relleno que quiera, no volverá a crecer.

Cuando la especificación dice que los elementos más allá del final del tamaño se eliminarán, significa en el lugar. Básicamente llamará a _M_buff [i]. ~ T() para cada elemento que está borrando. Por lo tanto, cualquier memoria que su objeto asigna se eliminará, suponiendo que funciona un destructor, pero el espacio que ocupa el objeto (su tamaño) no lo será. El vector crecerá, crecerá y crecerá hasta el tamaño máximo que se le indique y no se volverá a unir mientras exista.

Cuestiones relacionadas