百名山 API を開発しました | mountix APICLICK !

Rust | Vector 型の要素を検索して remove で削除をする

Rust Vec remove
  • URLをコピーしました!

Vector型の要素の中から削除したい条件で検索をかけてindexを特定し、remove 関数で削除する方法をまとめてみました。

Vector型の要素を検索して削除する

  1. vec.iter().position(|x| *x == target_x)で位置を特定
  2. vec.remove(index)で削除する
  3. vec.retain(|&x| x != keep_x)で条件に一致する要素のみを保持する方法も!
目次

removeで削除

remove 関数の引数はindex: usizeのみなので、削除対象の位置がわからない場合は事前に検索をかけてindexを特定した上で削除する必要があります。

位置を特定してremoveで削除する

position

positionでは、条件に一致する最初の要素の位置を取得することができます。

fn main() {
    let mut vec = vec![1, 2, 3, 2, 4, 5];

    if let Some(remove_index) = vec.iter().position(|x| *x == 2) {
        vec.remove(remove_index);
    }

    assert_eq!(vec, vec![1, 3, 2, 4, 5]);
}

条件に一致するすべての要素を削除することはできないので、注意が必要です。

rposition

rpositionでは、条件に一致する最後の要素の位置を取得することができます。

fn main() {
    let mut vec = vec![1, 2, 3, 2, 4, 5];

    if let Some(remove_index) = vec.iter().rposition(|x| *x == 2) {
        vec.remove(remove_index);
    }

    assert_eq!(vec, vec![1, 2, 3, 4, 5]);
}

positionと同様に条件に一致するすべての要素を削除することはできないので、注意が必要です。

retainで条件に一致する要素のみを保持する

removeではなく、retain 関数を使うことで条件に一致する要素のみを保持することができ、条件次第では削除したい要素すべてを削除することが可能です。

fn main() {
    let mut vec = vec![1, 2, 3, 2, 4, 5];

    vec.retain(|&x| x != 2);

    assert_eq!(vec, vec![1, 3, 4, 5]);
}

また、Rust の公式ドキュメントでは以下のような方法も紹介されていました。

fn main() {
    // ターゲットとなるVector
    let mut vec = vec![1, 2, 3, 2, 4, 5];
    // vecと対応するように保持する要素をtrueで表現したVector
    let keep = [true, false, true, false, true, true];

    let mut iter = keep.iter();
    vec.retain(|_| *iter.next().unwrap());

    assert_eq!(vec, vec![1, 3, 4, 5]);
}

.unwrap()で雑に処理しているため、keepの要素数がvecより少ないとパニックが発生しエラーとなるので注意してください。

まとめ

Vec 型の要素を操作するのは、なかなか難しい…

参考

著:初田直也, 著:山口聖弘, 著:吉川哲史, 著:豊田優貴, 著:松本健太郎, 著:原将己, 著:中村謙弘, 著:フォルシア株式会社
¥1,782 (2022/10/05 16:03時点 | Amazon調べ)
Rust Vec remove

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!

コメント

コメントする

目次