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:?}"); }
Vec
は Deref<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
の値により、ドキュメントに記されたすべてのスライスメソッドにアクセスできることだけを知っていれば十分です。