, se puede intercambiar el vector como han sugerido otros, y como se describe en http://www.gotw.ca/gotw/054.htm pero tenga en cuenta que se trata de no libre, que está realizando una copia de cada elemento, ya que el vector tiene que asignar una nueva, más pequeña , pedazo de memoria, y copia todos los contenidos anteriores. (La operación de intercambio es esencialmente libre, pero usted está intercambiando con un temporal inicializado con una copia de los datos del vector original, que es no libre)
Si usted sabe de antemano el tamaño del vector es, usted debe asignar el tamaño adecuado para empezar, por lo que no es necesario el cambio de tamaño:
std::vector<foo> v(1000); // Create a vector with capacity for 1000 elements
Y si usted no sabe la capacidad de anticipación, por qué es importante si se pierde un poco de espacio? ¿Vale la pena el tiempo dedicado a copiar cada elemento a un vector nuevo y más pequeño (que es lo que hará std :: vector (v) .swap (v)), solo para ahorrar algunos kilobytes de memoria?
Del mismo modo, cuando borre el vector, si tiene la intención de volver a llenarlo de todos modos, establecer su capacidad a cero parece ser una pérdida de tiempo impresionante.
Edición:
baash05: ¿Y si tuviera 1000000 artículos otros 10 megas de ram.¿Diría reduciendo la cantidad de gastos generales es importante?
No. Cambiar el tamaño del vector requiere más la memoria, de manera temporal, por lo que si eres de memoria limitada, que podría romper su aplicación. (Debe tener el vector original en la memoria, y el temporal, antes de poder intercambiarlos, por lo que termina usando hasta el doble de RAM en ese punto). Después, puede guardar una pequeña cantidad de memoria (hasta un par de MB), pero esto no importa, porque nunca se accederá al exceso de capacidad en el vector, por lo que sería empujado al archivo de paginación, por lo que no cuente hacia su límite de RAM en primer lugar.
Si tiene 1000000 elementos, entonces debe inicializar el vector al tamaño correcto en primer lugar.
Y si no puede hacer eso, entonces será mejor que deje la capacidad solo. Especialmente desde que declaró que va a volver a llenar el vector, definitivamente debe reutilizar la capacidad que ya ha sido asignada, en lugar de asignar, reasignar, copiar y liberar todo constantemente.
Tiene dos posibles casos. O sabe cuántos elementos necesita almacenar o no. Si lo sabe, puede crear el vector con el tamaño correcto en primer lugar, y así nunca tendrá que cambiarle el tamaño, o no lo sabe, y entonces también podría mantener el exceso de capacidad, por lo menos no tendrá que cambiar el tamaño hacia arriba cuando rellene su vector.
¿Su sistema tiene poca memoria? Reservar así significa que agregarle n elementos usa O (n^2) tiempo y como máximo n + 100 objetos por valor de espacio más error de redondeo. Permitir que el vector se extienda sería menos código, O (n) tiempo, y en la mayoría de las implementaciones usar como máximo 2 * n espacio más redondeo. –
Mi sistema tiene muy poca memoria. (Embebido) .. El código era realmente solo un ejemplo de lo que estoy pensando implementar. En general, obtengo 1000 fragmentos de elementos de la "tabla", por lo que tiene sentido cambiar el tamaño en la misma frecuencia. La LIMPIEZA fue mi principal preocupación. – baash05