Vec

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

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 でスライス メソッドを呼び出すことができます。

This slide should take about 5 minutes.
  • Vec は、String および HashMap とともにコレクションの一種です。含まれているデータはヒープに格納されるため、コンパイル時にデータ量を把握する必要はありません。データ量は実行時に増加または減少する場合があります。
  • Vec<T> もジェネリック型ですが、T を明示的に指定する必要はありません。Rust の型推論でいつも行われるように、最初の push 呼び出しで T が確立されています。
  • vec![...]Vec::new() の代わりに使用する正規のマクロで、ベクターへの初期要素の追加をサポートしています。
  • ベクターにインデックスを付けるには [ ] を使用しますが、境界外の場合はパニックが発生します。または、get を使用すると Option が返されます。pop 関数は最後の要素を削除します。
  • スライスについては 3 日目に説明します。受講者は現時点では、型 Vec の値により、ドキュメントに記されたすべてのスライスメソッドにアクセスできることだけを知っていれば十分です。