ArrayLabels

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2009-09-10 (木) 15:39:07

Chapter 20 標準ライブラリ

module ArrayLabels: sig .. end

配列処理です。


val length : 'a array -> int

与えられた配列の長さ (要素数) を返します。

val get : 'a array -> int -> 'a

Array.get a n は配列 a の n 番目の要素を返します。先頭の要素は 0 番目で、終端の要素は Array.length a - 1 番目になります。

n が 0 から (Array.length a - 1) の範囲内にない場合、例外 Invalid_argument "Array.get" を発生します。Array.get a n と書く代わりに、a.(n) と書くことも出来ます。

val set : 'a array -> int -> 'a -> unit

Array.set a n x は配列 a の n 番目の要素を x と置き換えます。

n が 0 から (Array.length a - 1) の範囲内にない場合、例外 Invalid_argument "Array.set" を発生します。Array.set a n x と書く代わりに、a.(n) <- x と書くことも出来ます。

val make : int -> 'a -> 'a array

Array.make n x は x で初期化された、長さ n の新規配列を返します。この配列の全ての要素は物理的に x と等値 (つまり ==) です。よって x が可変 (mutable) だった場合、x の内容は配列のすべての要素が共有するので、x を書き換えると同時に他すべての要素も書き換えられます。

n < 0 や n > Sys.max_array_length だった場合、例外 Invalid_argument を発生します。x が浮動小数だった場合、配列の最大長は Sys.max_array_length / 2 になります。

val create : int -> 'a -> 'a array

推奨されていません (Deprecated) 。 Array.create は ArrayLabels.make に飛ばされます (alias) 。

val init : int -> f:(int -> 'a) -> 'a array

Array.init n f は長さ n の配列を返します。i 番目の要素には f i の結果が初期値として入っています。 つまり、Array.init n f は f に整数 0 to n-1 を適用した結果を並べます。

val make_matrix : dimx:int -> dimy:int -> 'a -> 'a array array

Array.make_matrix dimx dimy e は dimx × dimy サイズの 2 次元配列 (配列の配列) を返します。要素はすべて e と物理的に等しいです。(x,y) の要素は m.(x).(y) としてアクセス出来ます。

dimx や dimy が 1 より小さかったり Sys.max_array_length より大きかったりする場合は例外 Invalid_argument を発生します。e が浮動小数だった場合、配列の最大長は Sys.max_array_length / 2 になります。

val create_matrix : dimx:int -> dimy:int -> 'a -> 'a array array

推奨されていません (Deprecated) 。 Array.create_matrix は ArrayLabels.make_matrix に飛ばされます (alias) 。

val append : 'a array -> 'a array -> 'a array

Array.append v1 v2 は配列 v1 と配列 v2 を結合した新規配列を返します。

val concat : 'a array list -> 'a array

Array.append と同じですが、こちらは配列のリストの各要素 (配列) を結合した新規配列を返します。

val sub : 'a array -> pos:int -> len:int -> 'a array

Array.sub a start len は配列 a の start 番目から start + len - 1 番目までの要素を長さ len の新規配列にして返します。

start と len が a の部分配列としてとれないような値の場合、つまり start < 0 、len < 0 、start + len > Array.length a のいずれかの場合、例外 Invalid_argument "Array.sub" を発生します。

val copy : 'a array -> 'a array

Array.copy a は配列 a のコピー、つまり配列 a と同じ要素の新規配列を作成して返します。

val fill : 'a array -> pos:int -> len:int -> 'a -> unit

Array.fill a ofs len x は、配列 a の ofs 番目から ofs + len - 1 番目の要素までを x に書き換えます。

ofs と len が a の部分配列としてとれないような値の場合、例外 Invalid_argument "Array.fill" を発生します。

val blit : src:'a array -> src_pos:int -> dst:'a array -> dst_pos:int -> len:int -> unit

Array.blit v1 o1 v2 o2 len は、配列 v1 の o1 番目の要素から len 個分の要素を読み、配列 v2 の o2 番目の要素から len 個分の要素へ上書きします。この関数は配列 v1 と配列 v2 が同じ配列で、読み込み元と書き込み先が重なっていても正常に動作します。

o1 と len が v1 の部分配列としてとれないような値の場合や、o2 と len が v2 の部分配列としてとれないような値の場合、例外 Invalid_argument "Array.fill" を発生します。

val to_list : 'a array -> 'a list

Array.to_list a は配列 a のすべての要素をリストにして返します。

val of_list : 'a list -> 'a array

Array.of_list l はリスト l のすべての要素を新規配列にして返します。

val iter : f:('a -> unit) -> 'a array -> unit

Array.iter f a は配列 a のすべての要素に f を適用します。f a.(0); f a.(1); ...; f a.(Array.length a - 1); () と同値です。

val map : f:('a -> 'b) -> 'a array -> 'b array

Array.map f a は配列 a のすべての要素に f を適用し、その結果を配列にして返します。[| f a.(0); f a.(1); ...; f a.(Array.length a - 1) |] と同値です。

val iteri : f:(int -> 'a -> unit) -> 'a array -> unit

ArrayLabels.iter と同じですが、1 つ目の引数には要素のインデックスを、2 つ目の引数に要素を入れて関数を呼び出します。

val mapi : f:(int -> 'a -> 'b) -> 'a array -> 'b array

ArrayLabels.map と同じですが、1 つ目の引数には要素のインデックスを、2 つ目の引数に要素を入れて関数を呼び出します。

val fold_left : f:('a -> 'b -> 'a) -> init:'a -> 'b array -> 'a

Array.fold_left f x a は f (... (f (f x a.(0)) a.(1)) ...) a.(n-1) を計算します (n は配列 a の長さです) 。

val fold_right : f:('a -> 'b -> 'b) -> 'a array -> init:'b -> 'b

Array.fold_right f a x は f a.(0) (f a.(1) ( ... (f a.(n-1) x) ...)) を計算します (n は配列 a の長さです) 。

Sorting

val sort : cmp:('a -> 'a -> int) -> 'a array -> unit

配列を昇順にソートします。比較関数は引数が同じ時 0 を、1 つ目の要素が大きいときは正の数を、1 つ目の要素が小さい時は負の数を返します。たとえば、Pervasives.compare は適切な比較関数です。Array.sort を実行すると、配列は昇順にソートされて置き換えられます。Array.sort はヒープ量一定で、(最大でも) 対数分のスタック量で実行されることが保証されています。

現在の実装はヒープソートです。これは一定のスタック量実行されます。

val stable_sort : cmp:('a -> 'a -> int) -> 'a array -> unit

ArrayLabels.sort と同じですが、アルゴリズムが stable です (比較が等しいときは元の順を保ちます) 。また、ヒープ量が一定であることを保証していません。 現在の実装はマージソートです。これは配列の長さを n として、n/2 ワード分のヒープ量で実行されます。こちらのほうが大抵の場合において現在の Array.sort の実装より速いです。

val fast_sort : cmp:('a -> 'a -> int) -> 'a array -> unit

典型的な入力に対して Array.sort か Array.stable_sort の速い方と同じ処理をします。

新規 編集 添付