2017-08-02 1 views
0

私は多次元スライスのクローンを作成しようとしていました。なぜなら、複製されたスライスの要素を変更すると、元のスライスの要素も上書きされたからです。私のために働いたゴラン多次元スライスコピー

唯一の方法は:

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を使ってinner forループを削除することはできますが、それがより効率的かどうかはわかりません。私は組み込みがあると思います。 – 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]) 
} 

あなたの目標は効率である場合、それはフロントまでより多くの割り当てを行うには意味をなさないことがあります。これにより、より読みやすいコードにはなりませんが、これを頻繁に行う場合は、より効率的なコードにつながります。このコードでは、少なくとも1つの行があり、すべての行の長さが同じであることを前提としています。そのためのテストを追加する必要があります。

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

BTW、単一スライスの使用に関する警告コメント。行列の長さを 'x'または' y'に変更した場合、フラットな行列を使ってみることは悪い考えです。 – RayfenWindspear