module Array: 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
val init : int -> (int -> 'a) -> 'a array
Array.init n f
は長さ n
の配列を返します。i
番目の要素には f i
の結果が初期値として入っています。
つまり、Array.init n f
は f
に整数 0
to n-1
を適用した結果を並べます。
n < 0
や n > 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 e
は dimx
× dimy
サイズの 2 次元配列 (配列の配列) を返します。要素はすべて e
と物理的に等しいです。(x,y
) の要素は m.(x).(y)
としてアクセス出来ます。
dimx
や dimy
が負であったり Sys.max_array_length
より大きかったりする場合は例外 Invalid_argument
を発生します。e
が浮動小数だった場合、配列の最大長は Sys.max_array_length / 2
になります。
val create_matrix : int -> int -> 'a -> 'a array array
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
は配列 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 -> int -> int -> 'a -> unit
Array.fill a ofs len x
は、配列 a
の ofs
番目から ofs + len - 1
番目の要素までを x
に書き換えます。
ofs
と len
が a
の部分配列としてとれないような値の場合、例外 Invalid_argument "Array.fill"
を発生します。
val blit : 'a array -> int -> 'a array -> int -> 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 : ('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 a
は f (... (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 x
は f a.(0) (f a.(1) ( ... (f a.(n-1) x) ...))
を計算します (n
は配列 a
の長さです) 。
Sorting
|
val sort : ('a -> 'a -> int) -> 'a array -> unit
Pervasives.compare
は適切な比較関数です (データのなかに浮動小数の NaN 値がない場合ですが) 。Array.sort
を実行すると、配列は昇順にソートされて置き換えられます。Array.sort
はヒープ量一定で、(最大でも) 対数分のスタック量で実行されることが保証されています。
現在の実装はヒープソートです。これは一定のスタック量実行されます。
比較関数を詳しく説明します。a
を配列、cmp
を比較関数としたとき、配列 a
の要素 x 、y 、z に対して次の 2 つの条件が常に成り立つ必要があります。
cmp y x
< 0 が成り立ち、また成り立つときに限り cmp x y
> 0 が成り立つcmp x y
>= 0 と cmp y z
>= 0 が成り立つ時 cmp x z
>= 0 が成り立つArray.sort
が終了すると、配列 a
は以前と同じ要素を、すべてのインデックス i と j に対して以下が成り立つように再配置されています。cmp a.(i) a.(j)
>= 0val 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