2010-04-13 14 views
38

Si uso .reserve (elementos) en un vector, el vector asignará suficiente memoria para mi conjetura del número de elementos que necesitaré.¿Una llamada a std :: vector :: clear() establecerá std :: vector :: capacity() en cero?

Si más tarde uso .clear(), ¿eso borrará el vector o guardará mi reserva definida anteriormente?

gracias.

+0

Eso es un engaño de http://stackoverflow.com/questions/586634/ – sbi

+9

No, no lo es, esa pregunta ni siquiera _mention_ 'clear()'. El único lugar donde se usa la palabra "borrar" es en un comentario que comienza con "No está claro para mí si ..." – MSalters

+1

Posible duplicado de [¿Qué dice la norma acerca de cómo llamar al claro en un vector cambia la capacidad? ] (http://stackoverflow.com/questions/18467624/what-does-the-standard-say-about-how-calling-clear-on-a-vector-changes-the-capac) –

Respuesta

44

Se especifica que std::vector<T>::clear() afecta el tamaño. Puede que no afecte la capacidad. Para restablecer la capacidad, utilice el truco de intercambio:

std::vector<int> v1; 

    // somehow increase capacity 

    std::vector<int>().swap(v1); 

Nota: Desde este viejo respuesta todavía está consiguiendo upvotes (por lo tanto la gente lo lee), siento la necesidad de añadir que C++ 11 ha agregado std::vector<...>::shrink_to_fit(), que solicita que el vector elimine la capacidad no utilizada.

+1

Es tan conocido que incluso puede encontrarlo aquí: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Clear-and-minimize no es similar "Shrink to fit" para reducir la capacidad del vector a la cantidad real de elementos (cuando hay algunos). –

+1

Puede afectar la capacidad. El estándar no lo requiere para evitar el cambio de capacidad o la reasignación. Entonces no hay garantía de ninguna manera. –

+0

@underscore_d: Gracias. Cambié la respuesta para arreglar esto. – sbi

0

No afectará el tamaño del búfer subyacente. Es por eso que tienes que usar trucos como this para deshacerte del buffer o hacerlo más pequeño.

10

Probablemente no libere la memoria reservada, aunque no creo que el comportamiento se especifique en el estándar.

EDIT: Ok, acaba de comprobar y la norma sólo se dice que el post-condición es que size() == 0 aunque no he llegado a través de una aplicación vector que no se aferran a la memoria reservada.

+6

+1 para verificar la estándar y "probablemente" (normalmente esperaría que la memoria permanezca). En un sistema integrado con el que trabajé, en realidad HE VISTO una implementación que libera la memoria en forma clara. –

7

No, no lo hará. Pruébelo llamando al vector::capacity().

Otra evidencia de esto es la apariencia de shrink_to_fit. Borrador de Trabajo de la norma menciona:

Observaciones: shrink_to_fit es una solicitud no vinculante para reducir la capacidad() para el tamaño(). [ Nota: La solicitud no es vinculante para permitir latitud para optimizaciones específicas de la implementación. -fin nota]

1

No, no fijará reserva() a 0. Llamar a clear() llama a los destructores de cada elemento y los elimina del vector, dejando el recipiente con el tamaño de 0, pero la capacidad permanece sin cambios.

+0

_si su implementación no lo cambia._ el estándar no requiere esto, por lo que la capacidad y la asignación pueden cambiar en 'clear()'. –