2011-12-17 21 views
9

Digamos que tengo un objeto que dinámicamente asigné. Si lo presiono en un vector STL, ¿se insertará una referencia en el vector o una copia de este objeto?std :: vector inserta una copia o referencia de un objeto?

Es una pregunta general. Por ejemplo:

class vec { 
vector<obj> vec; 
void addToVec(obj a) { 
    // insert a into vec 
} 
    ... 
    ... 
    ... 
} 

obj* a = new obj; 
vec* v = new vec; 
vec.addToVec(a); 

Si elimino v, ¿se objetará un dado también?

+1

Por favor muestra el código en el que estás pensando :-) –

+4

El lado prudente de mí está saliendo y creo que debo decirte que es muy probable que no signifiques la STL sino la biblioteca estándar de C++. – Corbin

+1

La biblioteca estándar de C++ ha adoptado el STL para sus contenedores y algoritmos. Entonces, técnicamente, un vector STL es el mismo que un vector de biblioteca C++. –

Respuesta

8

¿Se insertará una referencia en el vector o una copia de este objeto?

Copia (lo que significa que su class debería ser capaz de copiar-error de lo contrario compilador).

aclaración: Las referencias no se pueden asignar en std::vector<>. Además, aquí el objeto tiene un sentido más amplio, puede ser una variable normal o un puntero, pero std::vector<> solo acepta copia.

Actualización: Publique C++ 11, la mayoría de los contenedores estándar ofrecen std::move() del objeto utilizando "métodos rvalue baed API"; donde una copia no puede ser realizada.

+0

Me sorprendió, pensé que el compilador optimizaría la operación de copia en algunos casos, pero descubrí que no: http://ideone.com/b4fpc incluso con g ++ -O6 – matiu

+0

Este demuestra lo caro que es la operación de copia puede ser copiando un objeto de 131 KB: http://ideone.com/UNKyr – matiu

2

Ha comprobado la reference:

void push_back (const T& x); 

Añadir elemento al final

añade un nuevo elemento al final del vector, después de su último elemento actual. El contenido de este nuevo elemento se inicializa en una copia de x.

Esto efectivamente aumenta el tamaño del vector en uno, lo que causa una reasignación del almacenamiento interno asignado si el tamaño del vector era igual a la capacidad del vector antes de la llamada. Reasignaciones invalidan todos los iteradores obtenidos previamente, referencias y punteros

7

Si usted tiene un objeto de tipo T que ha asignado dinámicamente y que empujan un puntero al objeto en un std::vector<T*>, a continuación, una copia del puntero es empujado. Si desreferencia el puntero y envía el resultado a std::vector<T>, se realiza una copia del objeto. Las colecciones siempre hacen copias. Por lo tanto, las colecciones de punteros hacen copias del puntero y las colecciones de instancias de clases hacen copias de las instancias en sí (utilizando la copia de construcción IIRC).

Cuestiones relacionadas