数値計算では,たくさんの実数のを「配列」に格納して演算を行います。Rustには標準でどのような「配列」が用意されているのでしょうか。
配列
まずは普通の配列。コンパイル時にサイズが分かっている必要があります。
const N: usize = 1000;
let mut a = [0.0; N];
スタックに確保されるので,大きな配列には向いていません。
ベクター
お次は標準ライブラリの std::vec。ベクターはヒープ上に割り付けられる連続した可変長の配列。Vec::new()またはマクロvec![]で作ることができます。
Vec::with_capacity(100)とすると100個分の連続した領域が確保されますが,容量は100,長さは0です。次の例ではv.push(3.14)した時点でv.len()は0から1となり,v[0]にアクセスできるようになります。
let n = 100;
let mut v: Vec<f64> = Vec::with_capacity(n);
v.push(3.14);
println!("{} {}", v[0], v.len());
ボックス
std::boxedはヒープ上に割り付けられます。サイズはコンパイル時に分かっている必要があります。
const N: usize = 1000;
let mut b = Box::new(N);
動的割付配列
Cのmalloc,Fortranのallocateに相当する長さ固定の動的割付配列ものはないのでしょうか。vec::set_len()で長さを指定できるものの,unsafeです。ベクターで割り付けてからボックスに変換すると良さそうです。
fn myalloc(n: usize) -> Box<[f64]> {
vec![0.0; n].into_boxed_slice()
}