example array c++ vector copy std deep-copy

c++ - array - vector c ``



std vector C++-copia profunda o superficial (2)

Me pregunto si al copiar un vector estoy copiando el vector con sus valores (mientras que esto no está funcionando con una matriz, y la copia profunda necesita un bucle o memcpy).

¿Podría darnos una explicación?

Saludos


El vector cambiará de tamaño para tener suficiente espacio para los objetos. Luego recorrerá los objetos y llamará al operador de copia predeterminado para cada objeto.

De esta manera, la copia del vector es ''profunda''. La copia de cada objeto en el vector es lo que se define para el operador de copia predeterminado.

En ejemplos ... este es el código MALO:

#include <iostream> #include <vector> using namespace std; class my_array{ public: int *array; int size; my_array(int size, int init_val):size(size){ array = new int[size]; for(int i=0; i<size; ++i) array[i]=init_val; } ~my_array(){ cout<<"Destructed "<<array[0]<<endl; if(array != NULL) delete []array; array = NULL; size = 0; } }; void add_to(vector<my_array> &container){ container.push_back(my_array(4,1)); } int main(){ vector<my_array> c; { my_array a(5,0); c.push_back(a); } add_to(c); //At this point the destructor of c[0] and c[1] has been called. //However vector still holds their ''remains'' cout<<c[0].size<<endl; //should be fine, as it copies over with the = operator cout<<c[0].array[0]<<endl;//undefined behavior, the pointer will get copied, but the data is not valid return 0; }

Este es MEJOR código:

#include <iostream> #include <vector> using namespace std; class my_array{ public: int *array; int size; my_array(int size, int init_val):size(size){ cout<<"contsructed "<<init_val<<endl; array = new int[size]; for(int i=0; i<size; ++i) array[i]=init_val; } my_array(const my_array &to_copy){ cout<<"deep copied "<<to_copy.array[0]<<endl; array = new int[to_copy.size]; size = to_copy.size; for(int i=0; i<to_copy.size; i++) array[i]=to_copy.array[i]; } ~my_array(){ cout<<"Destructed "<<array[0]<<endl; if(array != NULL) delete []array; array = NULL; size = 0; } }; void add_to(vector<my_array> &container){ container.push_back(my_array(4,1)); } int main(){ vector<my_array> c; { my_array a(5,0); c.push_back(a); } add_to(c); //At this point the destructor of c[0] and c[1] has been called. //However vector holds a deep copy'' cout<<c[0].size<<endl; //This is FINE cout<<c[0].array[0]<<endl;//This is FINE return 0; }


Está haciendo una copia profunda cada vez que copia un vector. Pero si su vector es un vector de punteros, obtendrá la copia de los punteros, no los valores apuntados a

Por ejemplo:

std::vector<Foo> f; std::vector<Foo> cp = f; //deep copy. All Foo copied std::vector<Foo*> f; std::vector<Foo*> cp = f; //deep copy (of pointers), or shallow copy (of objects). //All pointers to Foo are copied, but not Foo themselves