首页 文章

C深拷贝矢量指针对象

提问于
浏览
-1

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

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 回答

  • 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
    }
    

    克里斯指出的一个可能的修改是使用 HeapItemclone() 方法,如果前者是多态类 - 请参阅对此答案的评论 .

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

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

相关问题