跳转至

Vector容器类型

Vector

Rust中的Vector 类型是一个动态数组容器类型,如果写过其他语言的话VectorJavaVector类的功能是很相似,也可以把它看作为Go中的切片类型。

创建

Vector是有大小限制的,在创建的时候可以通过with_capacity(n)来指定大小,也可以显示指定程序会自动推导出元素个数,如果当后面Vector添加新的元素的时候容量满了就会自动触发扩容机制。

  1. 通过new创建,push方法会往尾巴添加元素值,len获取元素个数。
fn main() {
    // 通过new创建
    let mut vector:Vec<u8> = Vec::new();

    for v in 0..10 {
        vector.push(v);
    }

    // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    println!("{:?}",vector);

     // `len` 方法获得一个 vector 的当前大小
    println!("Vector size: {}", vector.len());
}
  1. 通过with_capacity(n)来指定容量。

// 指定了容量大小
let mut vector_wcap:Vec<usize> = Vec::with_capacity(5);

    for v in 0..=5 {
        vector_wcap.push(v);
        // 看看什么时候触发扩容???
        if vector_wcap.len() > 5 {
            println!("index {}, Trigger expansion new len =  {}",v,vector_wcap.len())
        }
    }

    println!("{:?}",vector_wcap);
很明显在索引为5的时候触发了扩容。
index 5, Trigger expansion new len =  6
[0, 1, 2, 3, 4, 5]

修改和删除

Vector是一个动态的数组类型那么就应该支持修改和删除等操作。Vector访问支持通过索引和get(i)方法进行操作。

let mut vector:Vec<u8> = Vec::new();

    for v in 0..10 {
        vector.push(v);
    }

    // 通过索引访问
    vector[5] = 255;

    // [0, 1, 2, 3, 255, 5, 6, 7, 8, 9]
    println!("{:?}",vector);
也可以通过get函数进行获取某一个下标元素的值,但是返回的是一个Option<T>的类型,如果没有值返回的是NoneOption<T>类型Rust中的一个特殊的类型,后面文章深入。

    // index 4 value is Some(255)
    println!("index 4 value is {:?}",vector.get(4));
    match vector.get(2) {
        Some(third) => println!("The third element is {}", third),
        None => println!("There is no third element."),
    }

还有一种访问方式就是使用pop方法,返回最后一个元素并且在vec中删除该返回的元素。

    let v = vector.pop();
    // pop return value is Some(9)
    println!("pop return value is {:?}",v);

删除元素则通过remove(index)进行删除元素。

    // 删除第一个元素
    vector.remove(1);
    // [0, 2, 3, 255, 5, 6, 7, 8]
    println!("{:?}",vector);

遍历

因为是可变的vec这里在for的时候也要加上&mut然后进行遍历。

    let mut vector_wcap:Vec<usize> = Vec::with_capacity(5);

    for v in 0..=5 {
        vector_wcap.push(v);
        if vector_wcap.len() > 5 {
            println!("index {}, Trigger expansion new len =  {}",v,vector_wcap.len())
        }
    }

    println!("{:?}",vector_wcap);

    let mut arr:[usize;10] = [0;10];
    let mut index = 0;
    // 可变引用
    for v in &mut vector_wcap {
        // 解引用
        arr[index] = *v;
        index+=1
    }
    // 
    println!("{:?}",arr);

小结

vector也支持通过vec![]宏进行创建和使用,本篇就学习一下和总结了一下vectorcrud操作!

其他

  • https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a7f387f27832208d3b2d0727f476447e