📦

rust の vector 操作まとめ

に公開

Rust でよく使う Vec の操作を備忘録としてまとめました。

1. 先頭に要素を追加する

let mut v = vec![2, 3, 4];
v.insert(0, 1);  // 先頭に 1 を挿入
println!("{:?}", v); // [1, 2, 3, 4]
use std::collections::VecDeque;

let mut q = VecDeque::from(vec![1, 2, 3]);
q.push_front(0);
println!("{:?}", q); // [0, 1, 2, 3]

2. 先頭から要素を取り出す

let mut v = vec![1, 2, 3];
let first = v.remove(0); // 先頭を取り出す
println!("first = {}, v = {:?}", first, v); 
// first = 1, v = [2, 3]
use std::collections::VecDeque;

let mut q = VecDeque::from(vec![1, 2, 3]);
let first = q.pop_front();
println!("first = {:?}, q = {:?}", first, q);
// first = Some(1), q = [2, 3]

3. 末尾に要素を追加する

let mut v = vec![1, 2];
v.push(3);
println!("{:?}", v); // [1, 2, 3]

4. 末尾から要素を取り出す

let mut v = vec![1, 2, 3];
let last = v.pop();
println!("{:?}", last); // Some(3)
println!("{:?}", v);    // [1, 2]

5. 指定の位置に挿入する

let mut v = vec![1, 2, 4, 5];
v.insert(2, 3);
println!("{:?}", v); // [1, 2, 3, 4, 5]

6. 指定の位置の要素を取得する

let v = vec![10, 20, 30];
let x = v[1]; // 20

// 安全に取りたいとき
if let Some(x) = v.get(1) {
    println!("{}", x); // 20
}
// 元の vec は変化しない
println!("{:?}", v); // [10, 20, 30];
// 取り除きたいときは remove
println!("{}, {:?}", v.remove(1), v); // 20, [10, 30];

7. 2つの Vec をマージする

let mut v1 = vec![1, 2, 3];
let v2 = vec![4, 5, 6];
v1.extend(v2); // v1 に v2 を結合
println!("{:?}", v1); // [1, 2, 3, 4, 5, 6]

// 別の方法
let v3 = [vec![1,2,3], vec![4,5,6]].concat();
println!("{:?}", v3); // [1, 2, 3, 4, 5, 6]

8. 特定の値のインデックスを探す

let v = vec![10, 20, 30, 20];

if let Some(pos) = v.iter().position(|&x| x == 20) {
    println!("first: {}", pos); // 1
}

if let Some(pos) = v.iter().rposition(|&x| x == 20) {
    println!("last: {}", pos); // 3
}

9. ソートしてユニーク化する

let mut v = vec![3, 1, 2, 3, 2, 1, 5];
v.sort();
v.dedup();
println!("{:?}", v); // [1, 2, 3, 5]

Discussion