C++深层复制矢量指针对象

C++ Deep Copy Vector Pointer Object

本文关键字:指针 对象 复制 C++      更新时间:2023-10-16

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

vector<HeapItem*> myHeap;

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

前任:

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

由于您引入了 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所指出的,一个可能的修改是,如果前者是一个多态类,则使用HeapItemclone()方法——参见这个答案的评论。

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

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