Std 向量 C + + ——深拷贝或浅拷贝

我想知道是否复制了一个向量,我正在复制带有其值的向量(然而这并不适用于数组,并且深度复制需要一个循环或 memcpy)。

你能给个解释吗?

问候

107419 次浏览

任何时候复制矢量都是在进行深度复制。但是如果你的向量是指针的向量,你得到的是指针的拷贝,而不是指向的值

例如:

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

Vector 将调整大小,以便为对象提供足够的空间。然后,它将遍历这些对象并调用每个对象的默认复制操作符。

通过这种方式,向量的副本是“深”的。向量中每个对象的副本是为默认复制操作符定义的。

在例子中... 这是错误的代码:

#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;
}

这是更好的代码:

#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;
}