Rust(9) - Vector

Rust vector 類似 C++ 的 vector,超出 capacity 時會重新要求記憶體。需要注意的是當你的變數引用 vector 的元素參照時 Rust 會不讓你去修改 vector。

1. 宣告 Vector:

建立空向量。

fn main() {
    let v = vec![];
    println!("v: {:?}", v);
}

建立空向量並初始化內容。

fn main() {
    let v = vec![1, 2, 3, 4, 5];
    println!("v: {:?}", v);
}

利用 template,聲明元素型別。

let v: Vec<i32> = vec![];

2. 添加元素:

利用 push 可以將值推入 mutable vector 的尾端。

fn main() {
    let mut v: Vec<i32> = vec![];
    for it in 1..10 {
        v.push(it);
    }
    println!("v: {:?}", v);
}

3. 索引取值:

n 是 v 中元素的拷貝,所以可以變更 vector。

fn main() {
    let mut v = vec![1,2,3,4,5];
    let n = v[0]; // 拷貝
    v.push(6);
    
    println!("v: {:?}", v);
    println!("n: {}", n);
}

n 參照的是 v[0] 本身。考慮 capacity 不足時 vector 會要求更多的記憶體將資料拷貝到新的位址,Rust 會避免元素被其他變數引用時變更記憶體所以會報錯。

fn main() {
    let mut v = vec![1,2,3,4,5];
    let n = &v[0]; // 借用 v[0]
    v.push(6);

    println!("v: {:?}", v);
    println!("n: {}", n);
}

get 方法會回傳一個 Optional,可以用來確保索引的全性。

fn main() {
    let v = vec![1,2,3,4,5];
    match v.get(100) {
        Some(val) => println!("val: {}", val),
        _ => (),
    }
}

4. Iteration:

可以透過 vector 的 iter 及 iter_mut 方法遍歷元素。

修改 mutable 向量時要先解引。

fn main() {
    let mut v = vec![1,2,3,4,5];
    for it in v.iter() {
        println!("{}", it);
    }
    println!("v: {:?}", v);

    for it in v.iter_mut() {
        *it = *it+ 2;
        println!("{}", it);
    }
    println!("v: {:?}", v);
}

留言

熱門文章