22 votos

C++ vector::claro

vector <weight> decoy;

void clear_decoy() {  

    decoy.clear();   

    vector<weight> (decoy).swap(decoy);  
}

En el método anterior, clear_decoy(), ¿qué vector<weight> (decoy).swap(decoy); significa por favor?

¿El método clear decoy o no? Gracias!

21voto

James Curran Puntos 55356

Nunca he visto esa forma antes.

Lo he visto escrito como:

vector<weight>().swap(decoy);

Lo que significa "crear un nuevo vector vacío, y de intercambio con la existente.

vector<weight> (decoy).swap(decoy);

Para entender esto, divide en partes.

vector<weight>(decoy) crear un nuevo vector (con su contenido copiado de la ahora vacía señuelo). El nuevo vector es un anonomous temporal, así que vamos a pretent su nombre es newvector.

newVector.swap(decoy); intercambia el nuevo vector con decopy.

(Actualizado por los comentarios para corregir el error)

20voto

Billy ONeal Puntos 50631

Crea un nuevo vector de Weight objetos (que estará vacía) y swaps con decoy.

La razón de esto es que por defecto, std::vector<t>::clear a menudo, no es en realidad reducir el espacio de almacenamiento utilizado por un vector, tan sólo destruye todos los objetos que se encuentran allí. De esta manera, el vector tiene espacio para guardar más objetos sin reasignación en el futuro.

A veces, sin embargo, desea recortar la capacidad en el vector. Intercambio con un recién creado vector (que vive hasta el final de la línea, y por lo tanto es destruida) libera toda la memoria asignada por el vector.

10voto

Mike Seymour Puntos 130519

Que el código es de un fallido intento de utilizar un truco común para garantizar la memoria asignada por el vector es liberado. Puede o no puede hacer, dependiendo de si o no el vector del constructor de copia asigna memoria para que coincida con el otro vector de tamaño, o su capacidad.

De manera confiable libre de la memoria, utilice la siguiente:

void clear_decoy() {  
    vector<weight>().swap(decoy);  
}

Esto crea un temporal de vector vacío (con poca o ninguna memoria asignada), swaps de este con decoy de modo que la memoria es ahora propiedad de la temporal, y luego destruye el temporal, la liberación de la memoria.

6voto

Fred Larson Puntos 27404

clear elimina todas las entradas del vector, pero no necesariamente puede desasignar el espacio. Este intercambio lenguaje restaura el vector de no tener espacio asignado.

3voto

John Dibling Puntos 56814

Como 0A0D menciona, el efecto de la swap es el intercambio de la subyacente controlada de memoria entre los dos vectores. Pero esto merece un poco más de explicación.

Cuando clear una vector, los elementos son retirados de ella por lo menos tan lejos como el programador se refiere. size() se convierte en cero y capacity() puede o no puede cambiar. Pero la Norma no garantiza que la memoria utilizada por el vector realmente será devuelto al sistema operativo. Así que si tienes 1000 elementos en el vector antes de la clear() y cada uno tomó 1000 bytes de memoria, después de la clear() de cada elemento destructor es llamado, pero el vector todavía puede ser la celebración de un 1.000.000 de bytes de asignación.

Esto es a veces indeseables. El 'swap truco' de la nota anterior tiene el efecto de intercambiar el control de la memoria entre los dos vectores. Por lo tanto decoy termina con es controlada memoria de restablecimiento.

Aquí es lo que está sucediendo paso a paso:

  1. decoy elementos son cada erased. De los elementos destructores son llamó, y el vector size() se convierte en cero. La memoria real puede no se desasignado.
  2. Un nuevo vector se construye en la pila (vector<weight> (decoy)) y de los elementos de decoy se copian. Desde decoy fue sólo clear()ed, sin elementos se copian en el temporal del vector. Sin embargo, consulte edición de abajo. Usted no sabe que el control de la memoria no se intercambia.
  3. El temporal de vector y decoy's de la memoria se intercambian (.swap(decoy);), resultando en decoy ser desactivadas y memoria transferido a la temporal.
  4. El temporal cae fuera de la pila, lo que resulta en que la memoria se desasigna.

Esto se conoce como "el intercambio truco".

EDIT: Como se menciona Mike, el programador original está haciendo mal. El temporal no debe ser construido sobre la base de decoy, sólo debe ser construido por defecto. No sabemos con certeza que swap() sólo copia los elementos y no controlada de memoria por debajo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X