Vec

Vec は、標準のサイズ変更可能なヒープ割り当てバッファです:

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let mut v1 = Vec::new();
    v1.push(42);
    println!("v1: len = {}, capacity = {}", v1.len(), v1.capacity());

    let mut v2 = Vec::with_capacity(v1.len() + 1);
    v2.extend(v1.iter());
    v2.push(9999);
    println!("v2: len = {}, capacity = {}", v2.len(), v2.capacity());

    // 要素を指定してベクタを初期化するための標準的なマクロ。
    let mut v3 = vec![0, 0, 1, 2, 3, 4];

    // 偶数の要素だけを保持する。
    v3.retain(|x| x % 2 == 0);
    println!("{v3:?}");

    // 連続する重複要素を削除する。
    v3.dedup();
    println!("{v3:?}");
}

VecDeref<Target = [T]> を実装しているため、Vec に対してスライスのメソッドを呼び出せます。

  • Vec は、StringHashMap と同様にコレクション型の一種です。含まれるデータはヒープに格納されます。つまり、データ量はコンパイル時に分かっている必要がありません。実行時に増えたり減ったりできます。
  • Vec<T> もジェネリック型ですが、T を明示的に指定する必要はありません。Rust の型推論ではいつものように、T は最初の push 呼び出しで決まります。
  • vec![...]Vec::new() の代わりに使う標準的なマクロで、ベクタに初期要素を追加できます。
  • ベクタにインデックスでアクセスするには [ ] を使いますが、範囲外だと panic します。代わりに get を使うと Option が返ります。pop 関数は最後の要素を削除します。