C ++深拷贝矢量指针对象

时间:2014-11-22 02:52:23

标签: c++ vector copy copy-constructor deep-copy

我有一个名为Heap的类,它是一个指向HeapItem对象的指针的向量

vector<HeapItem*> myHeap;

我想创建一个Heap的深层副本,这样我就可以删除副本中的所有项目,而不会影响原始堆。

EX:

OriginalHeap = new Heap();
OriginalHeap.Insert(HeapItem1);
OriginalHeap.Insert(HeapItem2);
OriginalHeap.Insert(HeapItem3);

CopyHeap = OriginalHeap;
CopyHeap.deleteMin();

print(OriginalHeap);
print(CopyHeap);

输出:

OriginalHeap = HeapItem1,HeapItem2,HeapItem3

CopyHeap = HeapItem2,HeapItem3

1 个答案:

答案 0 :(得分:1)

由于您引入了Heap类的概念,它是vector<HeapItem*>的包装器,您可以为此类定义复制构造函数来处理所需的深度复制:

class Heap{
    vector<HeapItem*> data;
public:
    ...  // various constructors if needed
    Heap(const Heap& h) {
        data = new vector<HeapItem*>(h.size());
        for (int i=0; i<h.size(); i++)
            data[i] = new HeapItem(*h.data[i]);    // if HeapItem supports copy construction
    }
    ...  // various member functions if needed
}

Chris指出的一个可能的修改是使用HeapItem的{​​{1}}方法,如果前者是多态类 - 请参阅对此答案的评论。

此外,您可以定义复制分配(如果您希望能够将一个现有的clone()分配给另一个)并且您确定要定义析构函数以确保在{{1}时正确释放内存对象的生命结束了。

您还可以将Heap定义为模板类,以便您能够使用Heap类型对其进行参数化。