Rust 速習チュートリアル

Rust のベクタ

1. ベクタ(Vector)

ベクタ(Vector)は、サイズ変更が可能な配列です。通常の固定長配列とは異なり、ベクタは要素を追加したり削除したりして、動的にサイズを拡張・縮小させることができます。

2. ベクタの作成

ベクタを作成するには、vec! マクロを使用するのが最も簡単です。

サンプルコード

let fruits = vec!["りんご", "バナナ", "オレンジ"];

これにより、3つの文字列要素を持つベクタが作成されます。

3. ベクタ要素へのアクセス

配列と同様に、インデックス番号を使用してベクタ内の値にアクセスできます。

サンプルコード

let fruits = vec!["りんご", "バナナ", "オレンジ"];
println!("最初のフルーツ: {}", fruits[0]);

4. ベクタの値の変更

ベクタ内の値を変更するには、対象のインデックスを参照して新しい値を代入します。
その際、ベクタを宣言する時に mut キーワードを付けて「ミュータブル(変更可能)」にする必要があることを忘れないでください。

サンプルコード

let mut fruits = vec!["りんご", "バナナ", "オレンジ"];
fruits[0] = "グレープ";
println!("新しい最初のフルーツ: {}", fruits[0]);

5. ベクタへの要素追加

push() メソッドを使用すると、ベクタの末尾に新しい要素を追加できます。

サンプルコード

let mut fruits = vec!["りんご", "バナナ"];
fruits.push("さくらんぼ");
println!("{:?}", fruits); // ["りんご", "バナナ", "さくらんぼ"]

6. ベクタからの要素削除

ベクタの末尾から最後の要素を取り除くには、pop() を使用します。

サンプルコード

let mut fruits = vec!["りんご", "バナナ", "さくらんぼ"];
fruits.pop();
println!("{:?}", fruits); // ["りんご", "バナナ"]

7. 指定したインデックスでの追加と削除

Rustのベクタは基本的に「末尾」での追加・削除に最適化されていますが、先頭や特定のインデックスに対して操作を行うことも可能です。

7.1 insert() メソッド

特定のインデックスにアイテムを挿入するには insert() を使用します。

例:ベクタの先頭に「りんご」を追加する

let mut fruits = vec!["バナナ", "オレンジ"];
fruits.insert(0, "りんご");
println!("{:?}", fruits); // ["りんご", "バナナ", "オレンジ"]

例:ベクタの途中に「りんご」を追加する

let mut fruits = vec!["バナナ", "オレンジ"];
fruits.insert(1, "りんご");
println!("{:?}", fruits); // ["バナナ", "りんご", "オレンジ"]

7.2 remove() メソッド

特定のインデックスから要素を削除するには remove() を使用します。

例:ベクタの最初のアイテムを削除する

let mut fruits = vec!["りんご", "バナナ", "オレンジ"];
fruits.remove(0);
println!("{:?}", fruits); // ["バナナ", "オレンジ"]

       注意: 先頭付近で要素を追加または削除する操作は、末尾で行うよりも低速です。これは、操作箇所以降にあるすべての要素のメモリ上の位置をずらす(シフトさせる)必要があるためです。

8. ベクタの長さ

.len() メソッドを使用することで、ベクタ内に現在いくつの要素があるかを確認できます。

サンプルコード

let fruits = vec!["りんご", "バナナ", "さくらんぼ"];
println!("フルーツは {} 個あります。", fruits.len());

9. ベクタのループ処理

配列と同様に、for ループを使用してベクタ内のすべての値を順番に処理できます。

サンプルコード

let fruits = vec!["りんご", "バナナ", "オレンジ"];
for fruit in &fruits {
  println!("私は {} が好きです。", fruit);
}

重要: ループでは &fruits を使用してベクタを借用(Borrowing)するようにしてください。

Rustにおいて、借用とは所有権を奪うのではなく、値への参照を利用することを意味します。& を付けずにベクタをループさせると、所有権がループ内にムーブ(移動)してしまい、そのループ以降でそのベクタを使用することができなくなります。& を使って借用することで、ループが終わった後も引き続きベクタを使用することが可能になります。