Pregunta

¿Hay una manera de cambiar el tamaño de un std :: vector para reducir la capacidad cuando ya no necesito espacio reservado previamente?

¿Fue útil?

Solución

STL efectivo, por Scott Meyers, Artículo 17: Utilice el truco swap para recortar el exceso de capacidad.

vector<Person>(persons).swap(persons);

Después de eso, personas se reduce a "quot".

Esto se basa en el hecho de que el constructor de copias de vector asigna solo la cantidad de memoria necesaria para los elementos que se copian.

Otros consejos

Si está utilizando C ++ 11, puede usar vec.shrink_to_fit () . Al menos en VS2010, eso hace el truco de intercambio por usted.

Cree un vector nuevo, temporal desde el existente, luego llame al método de intercambio en el existente, pasando el temporal. Deje que lo temporal (ahora con el búfer de gran tamaño y antiguo) quede fuera del alcance.

Hey presto, tu vector tiene exactamente el tamaño correcto para su contenido.

Si esto suena como una gran cantidad de copias y asignaciones, tenga en cuenta que este es el vector que hace cada vez que tiene que reasignar su límite actual reservado de todos modos.

[Editar] Sí, acabo de decir lo mismo que Sebastien en más palabras. Otro caso de condición de carrera de stackoverflow ;-)

El truco de intercambio es una forma efectiva de reducir la capacidad de un objeto, intercambia el contenido de mi vector con uno recién creado por copia de construcción:

vector<Person>(persons).swap(persons);

Observe que no hay garantía de que persons.capacity (); después de que el truco de intercambio es igual a el tamaño: la capacidad del vector (personas) es la capacidad de implementación de la biblioteca Reservas a vectores de tamaño personas. Tamaño ().

C ++ 11 introdujo shrink_to_fit () .

shrink_to_fit () así como el truco de intercambio no garantiza que el tamaño de la capacidad sea efectivo reducido al tamaño del vector.

De todos modos, shrink_to_fit () puede invalidar sus iteradores (si se produce una reasignación) o no puede: Depende de la implementación real de la biblioteca.

Tenga en cuenta que el truco de intercambio requiere que las personas.tamaño () copien las construcciones de Persona y Person.size () destrucciones. El shrink_to_fit () pudo evitar toda esta copia y pudo deja tus iteradores válidos. Podría. Pero de vez en cuando sucede que shrink_to_fit () se implementa en términos del truco de intercambio ...

Está buscando un equivalente de QVector :: squeeze y me temo que no existe explícitamente en el STL. Vaya a la respuesta de Sébastien si es correcta para su implementación de STL.

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