前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

Rust学习笔记(十八)常用集合之Vector

qiguaw 2024-10-29 15:24:54 资源文章 18 ℃ 0 评论

使用Vector存储多个值

Vec<T>叫做vector:

  • 由标准库提供
  • 可存储多个值
  • 只能存储相同类型的数据
  • 值在内存中连续存放

创建Vector

使用Vec::new函数创建,例:

fn main() {
    let vec: Vec<i32> = Vec::new();//因为new函数创建的是空的vector,
                                   //里面没有数据,所以没法类型推断,需要在变量处指定
}

通常使用vec!宏来创建有初始值的Vec<T>,例:

fn main() {
    let vec = vec![1, 2, 3];//由数据推断出vec的类型是Vec<i32>
}

更新Vector

向Vector添加元素,使用push方法。例:

fn main() {
    let mut vec = Vec::new();
    vec.push(1);//往vector添加数据后,编译器就可以推断类型,所以声明时不需指定类型
    vec.push(2);
    vec.push(3);
}

删除Vector

与任何其它struct一样,当Vector离开作用域后:

  • 它就会被清理掉
  • 里面的元素也被清理掉了

例:

fn main() {
    let vec = vec![1, 2, 3];
}//离开作用域,vector和里面的元素都被清理掉

读取Vector的元素

有两种方式可以引用Vector里的值:

  • 索引
  • get方法

例:

fn main() {
    let vec = vec![1, 2, 3];
    let second = &vec[1];
    println!("The second element is {}", second);

    match vec.get(1) {
        Some(second) => println!("The second element is {}.", second),
        None => println!("There is no second element."),
    }

}

索引 vs get处理访问越界

  • 索引越界会导致程序运行时panic
  • get返回值是Option,可使用None处理

所有权和借用规则

  • 不能在同一作用域内同时拥有对某个值的可变和不可变引用,下面的代码就会编译失败
fn main() {
    let mut vec = vec![1, 2, 3];
    let second = &vec[1];
    vec.push(4);
    println!("The second element is {}", second);
}

引出一个问题:为什么编译器认为向Vector末尾push一个元素会引起&vec[1]的错误?因为Vector在内存中是连续存储的,向其末尾添加一个元素的时候可能存在空间不足的情况。此时内存会进行重分配,可能会导致&vec[1]指向的地址无效。

遍历Vector中的值

for循环,例:

fn main() {
    let vec = vec![1, 2, 3];
    for i in &vec {
        println!("{}", i);
    }

    //利用可变引用,一边遍历,一边修改值
    let mut vec = vec![1, 2, 3];
    for i in &mut vec {
        *i += 666;// *解引用
    }

    for i in &vec {
        println!("{}", i);
    }
}

使用enum来存储多种数据类型

  • 枚举的变体可以附加不同类型的数据
  • 枚举的变体定义在同一个枚举类型下,即变体都是同一个类型

所以可以创建一个使用附加数据的枚举类型的Vector,例:

enum SpreadsheetCell {
    Int(i32),
    Float(f64),
    Text(String),
}

fn main() {
    let row = vec![
        SpreadsheetCell::Int(666),
        SpreadsheetCell::Float(666.66),
        SpreadsheetCell::Text(String::from("666")),
    ];
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表