ベクター

ベクターは可変長の配列です。スライスのように、コンパイル時にはサイズがわかりませんが、 自由にサイズを伸縮できます。ベクターは次の3要素からなります。

  • データへのポインタ
  • 長さ
  • 容量

容量は、ベクターにどれだけのメモリが割り当てられているかを表します。容量を超えない 範囲で、ベクターの長さを伸ばすことができます。これを超える長さが必要になった時、 ベクターはもっと多い容量の場所へ再確保されます。

fn main() {
    // イテレータはベクターに変換することができます。
    let collected_iterator: Vec<i32> = (0..10).collect();
    println!("Collected (0..10) into: {:?}", collected_iterator);

    // `vec!`マクロでベクターを初期化できます。
    let mut xs = vec![1i32, 2, 3];
    println!("Initial vector: {:?}", xs);

    // ベクターに新しい要素を入れる
    println!("Push 4 into the vector");
    xs.push(4);
    println!("Vector: {:?}", xs);

    // エラー! 不変なベクターは伸ばすことができません。
    collected_iterator.push(0);
    // FIXME ^ この行をコメントアウトしてください

    // `len`メソッドで現在のベクターの要素数を取得できます。
    println!("Vector length: {}", xs.len());

    // 角括弧で要素にアクセスできます。(インデックスは0から始まります)
    println!("Second element: {}", xs[1]);

    // `pop`はベクターから最後の要素を消し、それを返します。
    println!("Pop last element: {:?}", xs.pop());

    // 長さ以上のインデックスを指定するとパニックします。
    println!("Fourth element: {}", xs[3]);
    // FIXME ^ この行をコメントアウトしてください

    // `Vector`は簡単にイテレーションできます。
    println!("Contents of xs:");
    for x in xs.iter() {
        println!("> {}", x);
    }

    // enumerateを使って要素のインデックスを変数(`i`)に
    // とってイテレーションできます。
    for (i, x) in xs.iter().enumerate() {
        println!("In position {} we have value {}", i, x);
    }

    // `iter_mut`のおかげで、可変な`Vector`を変更しながら
    // イテレーションできます。
    for x in xs.iter_mut() {
        *x *= 3;
    }
    println!("Updated vector: {:?}", xs);
}

Vecのメソッドをさらに知りたいときはstd::vecモジュール のドキュメントを参照してください。