我有一个名为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
答案 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
类型对其进行参数化。