61
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rustの「配列」たち

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?