rust學習九.1、集合之向量

正在战斗中發表於2024-11-14

一、綱要

定義


1. new Vec::new();
2. 採用宏 vec![1, 2, 3];


操作


0.讀取 索引語法或者 get 方法 ,注意索引從0開始. vec[0]或者vec.get(0)
vec[i] 不會改變所有權,但如果發生越界,則會導致程式終止
get(i) 返回的是一個Option型別,同樣不會改變所有權。越界放回None
rust也要照顧到大家的習慣,不要讀取一個索引就改變所有權。如果是那樣實在太麻煩了。
1.新增 push ,新增都尾部
2.修改 vec[0] = 10;
3.刪除 pub,remove
4.遍歷
a. 簡單語法 for i in &vec {}
b. 迭代器 for i in vec.iter() {}
c. for+get for i in 0..vec.len() { let e = &v[i]; }

向量和列舉


利用列舉的特性,而已讓向量儲存不同型別的資料,這是因為列舉允許不同成員有不同型別的資料。

應該沒有什麼人會這麼搞吧? rust還是有對應措施,使得有基本上可以匹配java的List<Object>的型別存在。

二、示例

fn main() {
    //1.0 定義
    let mut height_arr: Vec<i32> = Vec::new();    
    //1.1 宏定義
    let mut arr = vec![1, 2, 3];
    //2.0 新增元素
    height_arr.push(130);
    height_arr.push(135);
    height_arr.push(140);
    height_arr.push(142);
    height_arr.push(145);
    height_arr.push(150);
    height_arr.push(160);
    println!("{:?} 共有{}個元素", height_arr,height_arr.len());
    //2.1 訪問具體元素- 常規的方法不會導致所有權轉移
    let a1 = height_arr[0];
    let a2= height_arr.get(1).unwrap();
    println!("a1={},a2={}", a1,a2);
    //2.2 使用索引訪問,測試越界訪問。這會導致程式異常,並終止
    //如果是get越界,會返回None
    //thread 'main' panicked at xx.rs:52:24:
    //index out of bounds: the len is 7 but the index is 10
    println!("訪問越界元素");
    //let a3 = height_arr[10];  //這會導致程式異常,並終止
    let a3= height_arr.get(10);
    if let None = a3 {
        println!("不存在第11個元素:{}","None");
    }    

    //3.0 修改元素
    height_arr[0] = 131;
    //4.0 刪除元素
    height_arr.pop();  //移除最後一個元素
    println!("{:?} 移除一個後,還有{}個元素", height_arr,height_arr.len());
    //5.0 遍歷
    //5.1 簡單語法
    println!("遍歷一、簡單語法遍歷向量,所有權轉移");
    //for i in height_arr  這樣會導致所有權轉移
    //這裡必須使用引用,否則用過之後,所有都轉移了。後續要是再使用則會報錯
    for i in &height_arr {
        println!("{}", i);
    }
    //5.2 迭代器-這個方式不會改變所有權,後面可以繼續使用原來的變數
    println!("遍歷二、迭代器遍歷向量,所有權不轉移");
    for i in height_arr.iter() {
        println!("{}", i);
    }
    //5.3 for+get
    // 索引法和get方法都不會導致所有權轉移,所以可以繼續使用原來的變數
    println!("遍歷三、for+索引遍歷向量,所有權不轉移");
    for i in 0..height_arr.len() {
        let e = height_arr[i];
        let b = height_arr.get(i);
        println!("{},{:?}", e,b);
    }
 }

rust-script 執行下,結果如下:

三、小結

1.長度可變,容量自動管理
2.元素型別必須相同
3.可存放任何型別資料,包括引用
4.某種情況下,類似java的List,但比java的List差,因為java的List可以儲存不同型別成員
5. 向量具有許多的方法,需要自行去看api文件,無法一一列出,也沒有必要。

rust的向量的api文件 https://doc.rust-lang.org/std/vec/struct.Vec.html

相關文章