2009年7月4日土曜日

部分配列のコピー

-
 D言語で部分配列のコピーはスライシングというものを用います。部分的に切り抜くって感じです。配列名[開始位置..終了位置]でスライシングになります。部分配列をコピーする場合次のようにします。
dist[1..3] = src[0..2];
 これで、配列srcの0~1が配列distの1~2にコピーされます。なぜ、配列srcの0~2→配列distの1~3ではないのでしょうか。それは、我々が考える何々から何々までというのは、1個目、2個目、3個目と1から番号を付けるとき場合であって、コンピュータの世界の0から番号を付ける場合は別の何々から何々までがあるのです。
 コンピュータの世界の何々から何々までは、配列の要素に付いた添え字ではなく、それぞれの要素の区切りにつけられた番号と考えるほうが都合がいいです。

 こう考えると、先ほどのsrc[0..2]は配列srcの0~1になります。これでどう都合がよくなるのか。その一つは、配列の長さlengthを使ってsrc[0..length]としたときに、配列全てを表現できることです。

 さて、この部分配列のコピーですが、同じ配列の中へもコピーできます。ただし、その場合、コピー元の領域とコピー先の領域が重複していないことが条件です。

src[B1..B2] = src[A1..A2];
 これはエラーになります。
 この重複したらコピーできないという仕組みは非常に不便です。もし重複してもコピーしたかったら、自分で関数を作らないといけません。
 以下、私が作ったコピー関数です。
void arrayCopy(T[] src,int srcIndex,T[] dist,int distIndex,int width)
{
if(srcIndex<distIndex){
for(int i=width-1;i>=0;i--){
dist[distIndex+i] = src[srcindex+i];
}
}else{
for(int i=0;i<width;i++){
dist[distIndex+i] = src[srcindex+i];
}
}
}

0 件のコメント:

コメントを投稿