🦀

Rust 配列とVec型

に公開

はじめに

Rustの配列とVec型についてまとめてみます。

Rustの記事はカニの方が良さそうなので、変えてみました。

配列

サイズが固定長で、同じデータ型のみ格納できる。

初期化

  • 初期値を設定する場合
let a = [1, 2, 3, 4, 5];

この時、データ型が違うと、コンパイルエラーが出る。

  • 値を後で変更する場合は、
let mut a = [1, 2, 3, 4, 5];

このようにミュータブルにしておく必要がある。

  • すべて同じ値で初期化する場合
let mut a = [0; 100];

とすると、すべて0でサイズ100の配列ができる。

  • 空の配列
let mut a: [i32; 10];

こうするとi32型を格納できるサイズ10の配列が宣言できる。

Vec型

サイズが可変の配列。

初期化

  • 初期値を設定する場合
let a = vec!["a", "b"];

vec!は、標準ライブラリのマクロとして用意されている。

let a = vec!["a"; 10];

配列と同じように、すべての値を「a」としてサイズ10のVec型を作成できる。

  • 変数だけの初期化
let mut a: Vec<i32> = Vec::new();

i32型を格納するVec型の変数だけ宣言した状態になります。

push 末尾に追加

let mut a: Vec<i32> = Vec::new();
a.push(0);
a.push(1);

insert 任意の位置に挿入

let mut a: Vec<i32> = Vec::new();
a.push(0);
a.insert(0, 1); // 0番目に1を挿入

中身は、「1、0」の順になる。

remove 指定位置の要素を削除

let mut a: Vec<i32> = Vec::new();
a.push(0);
a.insert(0, 1); // 0番目に1を挿入
a.remove(0);    // 0番目の要素を削除

pop 末尾の要素を取り出して削除する。

let mut a: Vec<i32> = Vec::new();
a.push(0);
a.insert(0, 1);     // 0番目に1を挿入
let r = a.pop();    // 最後の要素を取り出して削除
let v = r.unwrap();

取得した要素は、Option型になっているので、unwrapして使う。

first、last 先頭、末尾の値を取得する。

let mut a: Vec<i32> = Vec::new();
a.push(0);
a.insert(0, 1);     // 0番目に1を挿入
let f = a.first();
let l = a.last();

こちらもOption型なので、unwrapして使う。

指定位置の値を取得

let a = vec![0, 1, 2, 3, 4];
let v0 = a[0];
let v1 = a.get(0);

[]もgetも同じく指定位置の値を取得するが、getの場合はOption型が返ってくる。

まとめ

値を設定して初期化できるのは便利そうではあるが、実際は便利なのでVec::new()をよく使いそうな感じがしています。
ただしサイズが決まっているのであれば、配列として作成したほうが、メモリの節約にはなりそう。

Discussion