2011-01-27 7 views
6
std::vector<AClass> vect; 
AClass Object0, Object1, Object2, Object3, Object4; 
vect.push_back(Object0); // 0th 
vect.push_back(Object1); // 1st 
vect.push_back(Object2); // 2nd 
vect.push_back(Object3); // 3rd 
vect.push_back(Object4); // 4th 

Pregunta 1 (Contracción): Es garantizado que las 0th, primera y elementos están protegidos (es decir, sus valores no cambian) después de cambiar el tamaño de este vector con este código: vect.resize(3) ?Cambiar el tamaño de un "std :: vector"; qué elementos se ven afectados?

Pregunta 2 (desplegable): Después de expandir este vector por el código vect.resize(7);
a. ¿Los primeros 5 elementos (0th hasta 4th) se mantienen sin cambios?
b. ¿Qué sucede con los dos elementos agregados recientemente (5th y 6th)? ¿Cuáles son sus valores predeterminados?

+2

Nota: Object0-4 se copian en el vector.Por lo tanto, el valor en el vector es distinto del valor original. –

Respuesta

10

Pregunta 1: Sí, la norma dice:

void resize(size_type sz); 

Si sz < size(), equivalente a erase(begin() + sz, end());.

Pregunta 2: Si no se requiere cambiar el tamaño, sí. De lo contrario, sus elementos se copiarán en un lugar diferente de la memoria. Sus valores permanecerán sin cambios, pero esos valores se almacenarán en otro lugar. Todos los iteradores, punteros y referencias a esos objetos serán invalidados. El valor predeterminado es AClass().

+2

+1 por mencionar iteradores invalidados. –

1

Pregunta 1:

Sí, desde cplusplus.com "Si sz es inferior al del vector de corriente, el contenido se reduce a sus primeros elementos SZ, y el resto se dejó caer."

Pregunta 2:

a) Los primeros elementos se mantienen sin cambios, el vector sólo aumenta el tamaño del buffer interno que es para agregar los nuevos elementos.

b) Se requiere el constructor predeterminado de AClass para la inserción de cada elemento nuevo.

+0

¿Qué pasa si el constructor predeterminado de 'AClass' es privado, y todos sus constructores disponibles esperan al menos un parámetro? – hkBattousai

+2

@hkB: Entonces obtendrá un error de compilación. – fredoverflow

1

vector siempre crece y se contrae al final, por lo que si reduce el tamaño de un vector, solo se eliminan los últimos elementos. Si creces un vector con tamaño, los nuevos elementos se agregan al final usando el objeto construido por defecto como el valor para las nuevas entradas. Para una clase, este es el valor de un nuevo objeto creado con el constructormas predeterminado. Para una primitiva, esto es cero (o falso para bool).

Y sí, los elementos que no se eliminan siempre están protegidos durante el cambio de tamaño.

1

Sí, cuando se encoge un vector, todos los objetos que permanecen conservan sus valores anteriores.

Al expandir un vector, proporciona un parámetro que especifica un valor que se utilizará para llenar las nuevas ranuras. Ese parámetro se establece de manera predeterminada en T().

Cuestiones relacionadas