数値計算では,たくさんの実数のを「配列」に格納して演算を行います。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()
}