Module Array


module Array: sig  end
配列処理です。

val length : 'a array -> int
与えられた配列の長さ (要素数) を返します。
val get : 'a array -> int -> 'a
Array.get a n は配列 an 番目の要素を返します。先頭の要素は 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 は配列 an 番目の要素を 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 xx で初期化された、長さ n の新規配列を返します。この配列の全ての要素は物理的に x と等値 (つまり ==) です。よって x が可変 (mutable) だった場合、x の内容は配列のすべての要素が共有するので、x を書き換えると同時に他すべての要素も書き換えられます。

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

val create : int -> 'a -> 'a array
推奨されていません (Deprecated) 。 Array.createArray.make に飛ばされます (alias) 。
val init : int -> (int -> 'a) -> 'a array
Array.init n f は長さ n の配列を返します。i 番目の要素には f i の結果が初期値として入っています。 つまり、Array.init n ff に整数 0 to n-1 を適用した結果を並べます。

n < 0n > Sys.max_array_length だった場合、例外 Invalid_argument を発生します。f の出力する型が float だった場合は、配列の最大長は Sys.max_array_length / 2 になります。

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

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

val create_matrix : int -> int -> 'a -> 'a array array
推奨されていません (Deprecated) 。 Array.create_matrixArray.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 -> int -> int -> 'a array
Array.sub a start len は配列 astart 番目から start + len - 1 番目までの要素を長さ len の新規配列にして返します。

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

val copy : 'a array -> 'a array
Array.copy a は配列 a のコピー、つまり配列 a と同じ要素の新規配列を作成して返します。
val fill : 'a array -> int -> int -> 'a -> unit
Array.fill a ofs len x は、配列 aofs 番目から ofs + len - 1 番目の要素までを x に書き換えます。

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

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

o1lenv1 の部分配列としてとれないような値の場合や、o2lenv2 の部分配列としてとれないような値の場合、例外 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 : ('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 : ('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 : (int -> 'a -> unit) -> 'a array -> unit
Array.iter と同じですが、1 つ目の引数には要素のインデックスを、2 つ目の引数に要素を入れて関数を呼び出します。
val mapi : (int -> 'a -> 'b) -> 'a array -> 'b array
Array.map と同じですが、1 つ目の引数には要素のインデックスを、2 つ目の引数に要素を入れて関数を呼び出します。
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b array -> 'a
Array.fold_left f x af (... (f (f x a.(0)) a.(1)) ...) a.(n-1) を計算します (n は配列 a の長さです) 。
val fold_right : ('a -> 'b -> 'b) -> 'a array -> 'b -> 'b
Array.fold_right f a xf a.(0) (f a.(1) ( ... (f a.(n-1) x) ...)) を計算します (n は配列 a の長さです) 。


Sorting


val sort : ('a -> 'a -> int) -> 'a array -> unit
配列を昇順にソートします。比較関数は引数が同じ時 0 を、1 つ目の要素が大きいときは正の数を、1 つ目の要素が小さい時は負の数を返します (比較関数の詳細は後述) 。たとえば、Pervasives.compare は適切な比較関数です (データのなかに浮動小数の NaN 値がない場合ですが) 。Array.sort を実行すると、配列は昇順にソートされて置き換えられます。Array.sort はヒープ量一定で、(最大でも) 対数分のスタック量で実行されることが保証されています。

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

比較関数を詳しく説明します。a を配列、cmp を比較関数としたとき、配列 a の要素 x 、y 、z に対して次の 2 つの条件が常に成り立つ必要があります。

Array.sort が終了すると、配列 a は以前と同じ要素を、すべてのインデックス i と j に対して以下が成り立つように再配置されています。
val stable_sort : ('a -> 'a -> int) -> 'a array -> unit
Array.sort と同じですが、アルゴリズムが stable です (比較が等しいときは元の順を保ちます) 。また、ヒープ量が一定であることを保証していません。

現在の実装はマージソートです。これは配列の長さを n として、n/2 ワード分のヒープ量で実行されます。こちらのほうが大抵の場合において現在の Array.sort の実装より速いです。

val fast_sort : ('a -> 'a -> int) -> 'a array -> unit
典型的な入力に対して Array.sortArray.stable_sort の速い方と同じ処理をします。