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