// dictionary
ベクタ(Vec).
Vec<T>(ベクタ)は、同じ型Tの要素を可変長で並べるコレクション型です。要素のデータをヒープ領域に確保し、実行時に要素を追加・削除して伸縮できます。要素数がコンパイル時に固定される配列型と違い、要素数が実行時に決まる列を扱えます。プリミティブ型ではなく、標準ライブラリが提供する型です。
fn main() {
let mut cart = vec![120, 250]; // vec!マクロで生成
cart.push(80); // 要素を末尾に追加
println!("商品数: {}", cart.len());
println!("価格一覧: {:?}", cart);
}Playgroundで開く生成方法
よく使う作り方は次のとおりです。
| 書き方 | 説明 |
|---|---|
Vec::new() |
空のベクタを作る(あとから追加していく用途) |
vec![120, 250, 80] |
要素を列挙して作る |
vec![0; 5] |
同じ値を5個並べて作る |
Vec::with_capacity(10) |
少なくとも10要素分の領域を先に確保して空のベクタを作る |
変更方法
要素を変更するには、変数をlet mutで可変として宣言しておく必要があります。
| 書き方 | 説明 |
|---|---|
v.push(x) |
要素を末尾に追加する |
v.pop() |
末尾の要素を取り出す(空ならNoneになるOption型で返る) |
v.insert(i, x) |
位置iに挿入する(以降の要素は後ろにずれる) |
v.remove(i) |
位置iの要素を取り除いて返す(以降の要素は前にずれる) |
v[i] = x |
位置iの要素を書き換える |
v.clear() |
全要素を削除する(確保済みの容量は残る) |
アクセス方法
配列型と同じく、添字v[i]とgetの2通りでアクセスできます。
補足
内部表現と自動伸長
Vec<T>は「データへのポインタ・長さ(要素数)・容量」の3つの値からなります。容量は確保済み領域に入る要素数で、長さが容量に達した状態で追加すると、より大きな領域を確保し直して自動で伸長します。このためpushは平均的には一定時間で済みますが、伸長が起きる回だけは全要素のコピーが発生します。なお、空のベクタ(Vec::new()やvec![])はヒープ確保を行わず、要素を削除しても容量は自動では縮みません(縮めるにはshrink_to_fitを使います)(std公式ドキュメント, Vec)。
この辞書が使われているページ
backlinks 12