kotonoha-pcgのブログ

dlang学習中です

動的配列のスライシング

 動的配列のスライシング。TDPL p.95。1年以上間が経ってるけれど、色々あってdlang書くのをやめていて、JavaをやったりC++をやってたりしてた。で、カビかけたTDPLと蟻本を見てまたやり始めてる、という次第。

スライシング

 配列中から一部の連続した領域を選択し、そこだけを操作できるようにする。TDPLのコードとはforを使って配列に代入しているのが違うくらいか。

import std.stdio, std.array, std.string;
int main(){
	
	//test of dynamic array and Associative array.
	auto array =new int[10];
	for(int i=0; i<10; i++)
	{
		array[i]=i;
	}
	//後ろ半分だけ表示
	//$はarray.lengthを表していると思われるし、
	//するとこれは~.length/2~~.lengthまでの
	//arrayの中身を表示する、という所か。
	
	writeln(array[$ / 2 .. $]);
        
        /*
	for(int i=0; i<10; i++)
	{
		writeln(array[i]);
	}
        */
	return 0;
}

実行結果

[5, 6, 7, 8, 9]

これ書いてるときに初めて知ったんですが、連想配列って"Associative array"なんですねぇ。今までlistedとか付けたらそれっぽいな、という感じで書いてた。なお、連想配列のコードは書いていませんが、その時点でのコードは大体ブログに乗っけるつもりでいるので、ファイル自体は後々使いまわす予定で書いています。
 下のforは一応デバッグに書いたものだったけど、わざわざこの程度でassert書くのも気が引けるのでこうした。どこいってもprint系デバッグは小規模なら確実なんじゃないかなぁ、とも思ってしまう。

 基本的には

writeln(array[$ .. $]);
//スライシングの式自体
[$ .. $]

のような感じで、$はarray.lengthと似ているというか、この時点では同義なものだと認識してる。一応"スライスの限界を示す、単純な添字によるアクセスのときと同様にスライスされる配列の長さを表す"、とは書いてあるので、認識的には間違ってないんじゃないかなー、という所。

 後々型引数とかの方でも目にするし、今の内にもう一回読み直してもいいかもしれない、と思っていて、それで4章はまた読み直している。3章でのwith,mixin,scope他のC++では俺は見かけなかったような文は後の章で出てくるものもあるし、概要として把握しておけばいいと割り切って読み進めている。