std :: vector copy,会发生什么?

时间:2015-07-29 19:20:53

标签: c++ vector std

我想向社区询问有关std :: vector的信息,来自C。

std::vector<int> temp1(4,0);
temp1[0] = 10;
std::vector<int> temp2;
temp2 = temp1;
temp1[0] = 0;
for (int i=0;i<4;i++)
    std::cout<<"temp1: " <<temp1[i]<<"temp2: "<<temp2[i]<< std::endl;

temp1:0 temp2:10

temp1:0 temp2:0

temp1:0 temp2:0

temp1:0 temp2:0

在temp2 = temp1,temp2似乎是一个深拷贝,这是正确的吗?另外,在这种情况下会发生什么?

std::vector<int> temp1(4,0);
std::vector<int> temp2(4,1);
for (int i=0;i<4;i++) {
    // some temp2 values filled
    temp1 = temp2;
}
return 0;

当temp1更新时,实际发生了什么。是否复制了以前的temp1的析构函数?

1 个答案:

答案 0 :(得分:1)

因为这些对象的类型为std::vector<int>,是的,它是一个深层副本,但不是,当你执行temp1 = temp2时,不会调用析构函数。

如果类型为std::vector<X>,其中X是一个类,那么 temp1 = temp2仍然是一个很深的副本 (取决于两个载体的进一步细节,可能还有 std :: vector的实现) 它可能破坏了 temp1的旧内容 - 也就是说,包含X类型的任何对象 在分配之前temp1,他们的毁灭者可能会被召唤。 (对std::vector<int>::operator= 的调用无法调用任何析构函数 因为int没有析构函数。)

如果类型为std::vector<*X>(现在X可以是类或int或其他一些原语,甚至是指针类型),temp1 = temp2将无法执行深度复制 - 至少,不会(通常)将其称为深拷贝,因为只复制指针并且它们指向与仍在temp2中的指针相同的对象。 (我说“通常”,因为有些情况下有人 可以争辩说,指针本身数据结构的内容 因此副本是“深度”。) 在这种情况下,即使X是一个类,也不会调用析构函数, 因为*X没有析构函数。