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