C++指针深度复制

Xer*_*nix 3 c++ pointers deep-copy

我试图制作一个指向整数数组的指针的深层副本,并且无法确定哪些代码不必要地冗长和需要什么.

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

int* vertexArray = new int[G->size()];
Run Code Online (Sandbox Code Playgroud)

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

int* shortestTour = vertexArray
Run Code Online (Sandbox Code Playgroud)

但我相信每次我置换vertexArray时都会做出最短的改变.是使用这样的循环对此进行深度复制的唯一方法

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

然后每当我发现一个比当前最短的旅程/路径短的时候运行该循环?

编辑:这是一个简单,蛮力实施旅行商问题.

vso*_*tco 7

正如您可能已经猜到的,深度复制不是复制指针(毕竟,指针只是指向某个内存位置的地址),而是复制指针指向的内存.

所以,如果你有

int* vertexArray = new int[G->size()];
Run Code Online (Sandbox Code Playgroud)

深刻的副本是

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

当然,有更聪明,更快速的方式来复制内存,比如

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

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

int* shallowCopy = vertexArray;
Run Code Online (Sandbox Code Playgroud)

你所做的任何修改都会被两个shallowCopy和两个vertexArray指针反映出来,因为它们现在指向相同的内存块.

您应该考虑是否需要深层复制.如果你只是想分享数据,你可能不会.如果数据必须是"本地的",那么你可能会这样做.