【问题标题】:C++ Pointer Deep CopyC++ 指针深拷贝
【发布时间】:2015-07-21 04:19:23
【问题描述】:

我正在尝试制作指向整数数组的指针的深层副本,但无法确定哪些代码不必要地冗长以及需要哪些代码。

我试图复制的指针只是一个简单的整数数组。

int* vertexArray = new int[G->size()];

它包含数字 0 到 size()-1 作为其值。我的第一个想法是创建一个等于顶点数组的新 int*,

int* shortestTour = vertexArray

但我相信每次我置换 vertexArray 时都会使 shortestTour 发生变化。是用这样的循环制作深拷贝的唯一方法

for(int i=0; i<G->size(); i++){
    shortestTour[i] = vertexArray[i];
}

然后每次我发现比当前最短的游览/路径短时运行该循环?

编辑:这是针对旅行商问题的简单、蛮力实现。

【问题讨论】:

  • 为什么不直接使用std::vector呢?
  • 您也可以使用std::copy() 来执行此操作。实际上不清楚你在问什么。
  • 需要深拷贝吗?还是分享数据就够了?

标签: c++ pointers deep-copy


【解决方案1】:

正如您可能已经猜到的那样,深拷贝并不是复制指针(毕竟,指针只是指向某个内存位置的地址),而是复制指针所指向的内存。

所以,如果你有

int* vertexArray = new int[G->size()];

深拷贝是

int* deepCopy = new int[G->size()];
for(size_t i = 0; i < G->size(); ++i)
    deepCopy[i] = vertexArray[i]; // copy the allocated memory 

当然,还有更智能、更快的复制内存的方法,比如

std::memcpy(deepCopy, vertexArray, sizeof(int)*G->size()); // should be faster

浅拷贝只是拷贝指针,而不是内存,

int* shallowCopy = vertexArray;

您所做的任何修改都将通过shallowCopyvertexArray 指针反映出来,因为它们现在都指向同一个内存块。

您应该考虑是否需要深拷贝。如果您只想共享数据,您可能不会。如果数据必须是“本地的”,那么您可能会这样做。

【讨论】:

    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2016-12-18
    • 2010-12-16
    • 1970-01-01
    相关资源
    最近更新 更多