2017-08-02 131 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