Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Rust辞典

  1. トップページ
  2. Rust辞典
  3. Vec::push() / pop() / insert() / remove()

Vec::push() / pop() / insert() / remove()

RustのVecには要素を追加・削除するメソッドが豊富に揃っています。『push()』で末尾追加、『pop()』で末尾取得と削除、『insert()』で任意位置への挿入、『remove()』で任意位置の削除を行えます。

構文
let mut v = vec![1, 2, 3];

// 末尾に要素を追加します。
v.push(4);              // [1, 2, 3, 4]

// 末尾の要素を取り出して削除します(Option<T>を返します)。
let last = v.pop();     // Some(4)、v = [1, 2, 3]

// 指定インデックスに挿入します。
v.insert(1, 99);        // [1, 99, 2, 3]

// 指定インデックスの要素を削除して返します。
let removed = v.remove(1);  // 99、v = [1, 2, 3]

// 条件を満たす要素を全て削除します(インプレース)。
v.retain(|&x| x % 2 != 0);  // 奇数のみ残します。

// 全要素を削除します(capacityは保持)。
v.clear();
メソッド一覧
メソッド概要
v.push(x)末尾に要素xを追加します。
v.pop()末尾の要素を取り出してOption<T>で返します。
v.insert(i, x)インデックスiの位置に要素xを挿入します。
v.remove(i)インデックスiの要素を削除して値を返します。
v.swap_remove(i)インデックスiの要素を末尾と入れ替えて削除します(高速)。
v.retain(|x| 条件)条件を満たさない要素を全て削除します(インプレース)。
v.retain_mut(|x| 条件)可変参照で条件判定しながら要素を削除します。
v.truncate(n)n要素目以降を削除します。
v.clear()全要素を削除します(capacityは保持されます)。
v.drain(範囲)指定範囲の要素をイテレータとして取り出して削除します。
v.append(&mut other)otherの全要素をvに移動します(otherは空になります)。
サンプルコード
fn main() {
    let mut v = vec![10, 20, 30, 40, 50];
    println!("初期状態: {:?}", v);

    // push(末尾追加)です。
    v.push(60);
    v.push(70);
    println!("push(60), push(70): {:?}", v);

    // pop(末尾から取り出し)です。
    let last = v.pop();
    println!("pop() = {:?}, v = {:?}", last, v);

    // insert(任意位置への挿入)です。
    v.insert(2, 99);  // インデックス2に99を挿入します。
    println!("insert(2, 99): {:?}", v);

    // remove(任意位置の削除)です。
    let removed = v.remove(2);
    println!("remove(2) = {}, v = {:?}", removed, v);

    // swap_remove(高速な削除:末尾と入れ替え)です。
    // 順序は変わりますが remove より高速です。
    let swapped = v.swap_remove(1);
    println!("swap_remove(1) = {}, v = {:?}", swapped, v);

    println!();

    // retain(条件で絞り込み)です。
    let mut nums = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    nums.retain(|&x| x % 2 == 0);  // 偶数のみ残します。
    println!("偶数のみ retain: {:?}", nums);

    // truncate(n要素目以降を削除)です。
    let mut v = vec![1, 2, 3, 4, 5];
    v.truncate(3);
    println!("truncate(3): {:?}", v);

    // drain(範囲を取り出して削除)です。
    let mut v = vec![1, 2, 3, 4, 5];
    let drained: Vec<i32> = v.drain(1..3).collect();  // 1〜2番目を取り出します。
    println!("drain(1..3): drained={:?}, v={:?}", drained, v);

    // append(別Vecの要素を全移動)です。
    let mut v1 = vec![1, 2, 3];
    let mut v2 = vec![4, 5, 6];
    v1.append(&mut v2);
    println!("append後: v1={:?}, v2={:?}", v1, v2);  // v2は空になります。

    // clear(全削除)です。
    let mut v = vec![1, 2, 3];
    let cap_before = v.capacity();
    v.clear();
    println!("clear後: len={}, capacity={}", v.len(), v.capacity());
    println!("capacity保持: {} → {}", cap_before, v.capacity());
}
概要

『remove()』はO(n)の時間複雑度で後ろの要素を1つずつ前にずらします。順序を維持する必要がない場合は『swap_remove()』を使うとO(1)で削除できます。

『retain()』はイテレーション中に要素を削除できる便利なメソッドです。内部的には条件を満たす要素だけを前方に詰めるため、O(n)で動作します。

pop()はOption<T>を返します。Vecが空のときはNoneを返すため、戻り値を使う場合はmatchやunwrap_or()で処理してください。

Vecの生成方法は『Vec::new() / vec![]』、ソート・重複削除は『Vec::sort() / dedup() / extend()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。