kotonoha-pcgのブログ

dlang学習中です

D言語3(配列1,Range)

std.arrayを用いない,至って普通の配列

import std.stdio;

int main()
{
	int[]  arr=[100,200,300];
	for(uint i;i<arr.length;i++) writeln(arr[i]);
	return 0;
}

出力結果

100
200
300

Rangeについて

 前回の記事でも書いたD言語基礎文法最速マスターでも出てきているRangeがいまいち分からない.D言語友の会というサイトには

レンジは一般にコンテナと呼ばれる、内部に複数のデータを保有するようなオブジェクトが、特定のメンバ関数やプロパティを実装することで統一的に操作できる仕組みを提供します。

http://dusers.dip.jp/modules/wiki/?Other%2FRange%E3%81%BE%E3%81%A8%E3%82%81

と書いてある.コンテナというと直ぐC/C++STLにあるalgorithmを思い出すのだけれど,ある意味でそう考えて良いのかもしれない.前述したD言語基礎文法最速マスターには,4. 配列 の 配列の操作 に,

std.arrayを使うとD言語での標準的なインターフェイス(Range)が利用できます.

と書いてあるし,本質は理解しきれていない.昔(2年前)Cを習ったときに見た //おまじない みたいなもの,という認識になっている.

 では本題に.なぜここでRangeかというと,std.arrayを用いることでRangeを利用することができる,らしい.少し読んでみると,".front"とか".popFront()"とか,どっかで見たような挙動をしている.これらの命令文の一部(insertとか)にRangeが使われているからさっきの文を読んでいた.

import std.stdio;
import std.array;

int main()
{
        ///型推測でint型配列を宣言
	auto arr =[1,2,3];
        ///aに対し,arrの最初の要素を代入
	auto a = arr.front;
        ///aを出力
	writeln(a);
	///arrの最初の要素を排除
        arr.popFront();
        ///bに対してarrの末尾を取得
	auto b = arr.back;
        bを出力
	writeln(b);
        ///arrの末尾を削除
	arr.popBack();
        arrの末尾に要素を追加
	arr ~= 4;
	return 0;
}

出力結果

1
3