Pregunta

Con respecto al artículo Gotw 54 por HerbSutter, explica acerca

  1. La manera correcta de "Shrink-A-Fit" una vector o deque y

  2. La forma correcta para borrar completamente un vector o deque

  

¿Podemos utilizar container.resize()   y container.clear() para la tarea anterior   o me estoy perdiendo algo?

¿Fue útil?

Solución

Hay dos cosas diferentes que contiene un vector: size Vs capacity. Si sólo resize el vector, no hay garantía de que la capacidad (la cantidad de memoria reservada) debe cambiar. resize es una operación de que se trate con la cantidad está usando, no cuánto es la capacidad del vector.

Así, por ejemplo.

size     == how much you are using
capacity == how much memory is reserved
vector<int> v(10);

v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear()    // size == 0 but capacity (may or may) not be changed

Al final, la capacidad no debe cambiar en cada operación, ya que traería una gran cantidad de sobrecarga de la memoria de asignación / desasignación. Él está diciendo que si es necesario " deallocate " memoria reservada por el vector, hacer eso.

Otros consejos

Ni cambiar el tamaño (), ni de trabajo claro (). El .capacity() de un vector se garantiza que sea al menos tan grande como el size() actual del vector, y garantiza que sea al menos tan grande como la capacidad reserve()d. Además, este .capacity() no se encoge, por lo que también es al menos tan grande como cualquier size() o reserve()ation anterior.

Ahora, el .capacity() de un vector no es más que la memoria se ha reservado. A menudo, no toda esa memoria cotains objetos. Cambiar el tamaño elimina los objetos, pero no recicla la memoria. Un vector sólo puede reciclar su búfer de memoria cuando la asignación de un búfer mayor.

El truco de intercambio funciona copiando todos oyectos a un búfer de memoria más pequeña, más apropiado. Posteriormente, el búfer de memoria original se puede reciclar. Esto parece violar la afirmación anterior de que el búfer de memoria de un vector sólo puede crecer. Sin embargo, con el truco de intercambio, que tiene forma temporal 2 vectores.

El vector tiene tamaño y capacidad. Puede contener elementos X, pero han memoria sin inicializar en el almacén para elementos Y más. En una implementación típica de borrado, cambiar el tamaño (al cambiar el tamaño de un tamaño más pequeño) y claro no afectan a la capacidad de:. El vector guarda la memoria en torno a sí mismo, en caso de que sea necesario añadir nuevos elementos a ella en un momento posterior

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top