Progrust Library.

// 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)。

関数に渡すときはスライスで

Vec<T>への参照は、関数の引数など型強制が働く場所では自動的にスライスへの参照&[T]へ変換されます(Derefによる型強制)。読み取りだけの関数は引数を&[T]で受けるのが定番で、配列からもベクタからも同じように呼び出せます。なお文字列型は、バイト列のVec<u8>のラッパーとして実装されています(The Rust Programming Language, 8.2章)。

この辞書が使われているページ

backlinks 12

  1. 辞書for式
  2. 辞書while式
  3. 辞書クローン
  4. 辞書コンソール出力
  5. 辞書スライス
  6. 辞書ムーブ
  7. 辞書関連関数
  8. 辞書配列型
  9. 辞書範囲式
  10. 辞書標準ライブラリ
  11. 辞書文字列型
  12. 動かして学ぶRustプログラミング問題集 › 第6章 文字列とベクタ