2014-11-22 79 views
-1

我有一类称为堆是指针的向量,以HeapItem对象C++深拷贝载体的指针对象

vector<HeapItem*> myHeap; 

我想创建堆的深层副本,这样我可以删除所有项目复制而不影响原始堆。

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

是HeapItem的基类吗? – 2014-11-22 03:34:23

回答

1

由于你介绍堆类的概念,其是一个wrapper for 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 
} 

一种可能的修改是由克里斯指出的是使用HeapItemclone()方法,如果前者是一个多态类 - 看评论这个答案。另外,您可以定义复制分配(如果您希望能够将一个现有的Heap分配给另一个),并且您确定要定义析构函数以确保Heap对象的生命期结束时内存已正确释放。

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

+1

如果HeapItem是多态类型,则必须小心谨慎,否则您可以对这些项目进行分片。经典的解决方案是在HeapItem上使用虚拟克隆方法。如果HeapItem不是多态的,没有理由不将它存储在向量中。 – 2014-11-22 03:42:03

+0

所以你的意思是代替'data [i] = new HeapItem(* h.data [i]);'它会像'data [i] = h.data [i] - > clone();'where clone()返回指向HeapItem的子类的指针? – 2014-11-22 03:50:12

+0

是的,请参阅[这里](http://books.google.co.uk/books?id=mmjVIC6WolgC&lpg=PP1&dq=coding%20standards%20c%2B%2B%20clone&pg=PT336#v=onepage&q&f=false),for例。 – 2014-11-22 03:54:03