En realidad, la norma especifique lo que debe suceder:
Esto es de vector
, pero el tema es el mismo para todos los contenedores (list
, deque
, etc ...)
23,2 .4.2 capacidad vector [lib.vector.capacity]
void resize(size_type sz, T c = T());
6) Efectos:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size())
erase(begin()+sz, end());
else
; //do nothing
Es decir: si el tamaño especificado a resize
es menor que el número de elementos, estos elementos serán borrados del contenedor. Con respecto a capacity()
, esto depende de lo que erase()
le haga.
no puede localizarlo en la norma, pero estoy bastante seguro de clear()
se define como:
void clear()
{
erase(begin(), end());
}
Por lo tanto, los efectos clear()
tiene en capacity()
también está relacionada con los efectos erase()
tiene en él. De acuerdo con el estándar:
23.2.4.3 modificadores vectoriales [lib.vector.modificadores]
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
4) Complejidad: El destructor de T se denomina el número de veces igual al número de los elementos borrados ....
Esto significa que los elementos será destruido, pero la memoria permanecerá intacta. erase()
no tiene ningún efecto sobre la capacidad, por lo tanto, resize()
y clear()
tampoco tienen ningún efecto.
De la forma en que lo leí, pregunta sobre el impacto en el uso de la memoria: pregunta específicamente cuál es el efecto sobre la capacidad de cambiar el tamaño. La norma no especifica el resultado en ese caso, pero la única razón para preguntar en lo que puedo pensar es en el deseo de liberar la memoria no utilizada. El intercambio con truco temporal es la forma idiomática de lograr eso. – mattnewport
El estándar especifica el resultado al no especificar una disminución de la capacidad() para estas operaciones. Por lo tanto, no puede disminuir. – MSalters
Hay algunos entornos en los que está prohibido asignar o liberar memoria después de una fase inicial de 'construcción'. Los vectores se pueden usar en este entorno, siempre que uno pueda estar seguro de que no intentan asignar o liberar memoria durante las operaciones. Entonces esta pregunta es relevante en esta situación (que me trajo aquí). – meowsqueak