2017-08-02 133 views
0

我试图制作多维切片的克隆,因为当我更改了重复切片中的元素时,原始切片中的元素也被覆盖。Golang多维切片复制

为我工作的唯一方法是:

duplicate := make([][]int, len(matrix)) 
for i := 0; i < len(matrix); i++ { 
    duplicate[i] = make([]int, len(matrix[0])) 
    for j := 0; j < len(matrix[0]); j++ { 
     duplicate[i][j] = matrix[i][j] 
    } 
} 

是否有任何其他的方式 - 更短或更有效地达到同样的效果?谢谢

+1

您可以使用https://golang.org/pkg/builtin/#copy消除内循环,但我不确定它是否更有效。我猜想内建是会的。 – RayfenWindspear

+0

谢谢,工作;)至少不会写 –

+0

我可能稍后会对它进行基准测试,因为我很好奇它是如何比较的。 – RayfenWindspear

回答

3

你可以使用副本的内部循环(应该更有效率)和外部循环的范围(这导致更好的代码)。

结果:

duplicate := make([][]int, len(matrix)) 
for i := range matrix { 
    duplicate[i] = make([]int, len(matrix[i])) 
    copy(duplicate[i], matrix[i]) 
} 

如果你的目标是效率,它可能是有意义的做多分配了前面。这不会导致更易读的代码,但如果您经常这样做,会导致更高效的代码。此代码假定您至少有一行,并且所有行的长度相同。您需要为此添加测试。

n := len(matrix) 
m := len(matrix[0]) 
duplicate := make([][]int, n) 
data := make([]int, n*m) 
for i := range matrix { 
    start := i*m 
    end := start + m 
    duplicate[i] = data[start:end:end] 
    copy(duplicate[i], matrix[i]) 
} 

取决于你在做什么,它可能是有意义的做一个“矩阵式”,也就是只用一个片来实现。切片片不是最有效的数据结构,即使它更简单。


在决定是否需要高效之前,请确保您花费大量时间进行使用分析的复制。然后,在你确定这实际上是一个热点后,开始运行基准测试。详情请参阅https://golang.org/pkg/testing/#hdr-Benchmarks

+0

谢谢;)好主意 –

+0

哈,如果我知道我会得到那么简单的代表,我自己会做一个完整的答案。不过,因为这真的是一个很好的答案。 – RayfenWindspear

+0

顺便说一句,使用单个切片的警告评论。如果你碰巧修改矩阵的x或y长度,尝试使用平坦矩阵是一个坏主意。 – RayfenWindspear