Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

Rust で Vector の先頭の要素を取り出したり押し込んだりするときは VecDeque を使う

通常の Vector では push() と pop() しかなくて、いずれも配列の最後の要素に対してしか操作できない。先頭の要素を取り出したり、要素を押し込んだりするためには、std::collections::VecDeque を使うのが良いようだ。
Ruby の Array#shift とか Array#unshift と同じ動きのやつ)

VecDeque in std::collections - Rust

use std::collections::VecDeque;

fn main() {
    // いつもの Vec
    let mut v: Vec<i32> = Vec::new();
    v.push(1); // 末尾に追加
    v.push(2);
    v.push(3);
    v.push(4);
    v.pop(); // 末尾から取得して削除 (Option<T>)
    assert_eq!(vec![1, 2, 3], v);

    let mut v2: VecDeque<i32> = VecDeque::new();
    v2.push_back(1); // Vec push と同じ
    v2.push_back(2);
    v2.push_back(3);
    v2.push_back(4);
    v2.pop_front(); // 先頭から取得して削除 (Option<T>)
    assert_eq!(vec![2, 3, 4], Vec::from(v2.clone()));

    v2.push_front(1);  // 先頭に要素を押し込む
    v2.pop_back();    // Vec pop と同じ
    assert_eq!(vec![1, 2, 3], Vec::from(v2.clone()));
}

Vector とはメモリの使い方が違うらしく、ソートとかスライスとかを期待通りに取得するためには、その前に make_contiguous() で合体しないといけならしいので注意するというメモ。