Help us understand the problem. What is going on with this article?

Rustの「配列」たち

More than 1 year has passed since last update.

数値計算では,たくさんの実数のを「配列」に格納して演算を行います。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()
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away