Rust与Vector

简介: Rust与Vector

Rust与Vector

Rust标准库中内置了许多集合,这与tuple有区别,集合是被存放在heap堆内存上,并且不需要声明时就指定长度,这也使其更加灵活。

我们常用的集合为:Vector,String,HashMap,本篇文章将介绍Vector这一数据类型

Vector

使用Vector存储多个值

Vector类型为Vec<T>,其中关于Vector我们需要知道的是:

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

创建Vector

我们可以使用Vec::new()来创建一个Vector:

fn main() {
    let v: Vec<i32> = Vec::new();
}

一般我们不需要显示的指明vector的类型,当我们存入一个数据时,编译器会将这个值的类型作为vector的类型。

通常我们使用vec!宏来通过初始值来创建一个Vec<T>

let v = vec![1, 2, 3];//v: Vec<i32>

更新Vector

我们使用push向vector添加元素

我们先声明一个vector,但不声明类型,这时候会报错:

let mut v = Vec::new();//v:Vec<{unknown}, Global>

我们在后面使用push来添加元素,这时报错就消失了,并且我们会得到vector的类型:

let mut v = Vec::new();//v:Vec<i32, Global>
v.push(1);
v.push(2);
v.push(3);
v.push(4);

我们使用mut声明是因为我们会修改vector,向里面添加元素。

注意vector的类型是一致的:

let mut v = Vec::new();
v.push(1);
v.push(false);//error:mismatched types

删除Vector

与struct一样:

  • 当vector离开作用域的时候,它会被清理掉
  • 它所有的元素也会被清理掉

但是当vector中的元素被引用的时候,这里的情况就变复杂了,下面将对这种情况进行研究

读取vector的值

有两种方式可以读取vector的值:

  • 使用索引
  • 使用get方法
fn main() {
    let v = vec![1, 2, 3, 4];
    let third = &v[2];
    //the third value of v is 3
    println!("the third value of v is {}", third);

    match v.get(2) {
        // the third value of v is 3
        Some(third) => println!("the third value of v is {}", third),
        None => println!("there is no third element"),
    }
}

使用索引和get处理访问越界的区别

  • 索引:panic
  • get:返回None

我们尝试将索引的值改为100,很明显,这个值超出了vector的范围:

let v = vec![1, 2, 3, 4];
let third = &v[100];//会引起panic
println!("the third value of v is {}", third);

而使用get方法不会:

fn main() {
    let v = vec![1, 2, 3, 4];

    match v.get(100) {
        Some(third) => println!("the third value of v is {}", third),
        None => println!("there is no third element"),
    }
    //there is no third element
}

这是因为,匹配的值的类型为一个Option<T>,超出索引时,这个表达式的值为None

所有权和借用规则

不能在同一作用域内同时拥有可变和不可变引用:

let mut v = vec![1, 2, 3, 4];
let third = &v[2];
v.push(5); //cannot borrow `v` as mutable because it is also borrowed as immutable
println!("The Third v is {}", third);

报错的原因:vector在内存中的摆放是连续的,如果我们push,就可能没有这么大的内存块了。内存可能就会进行重新分配,然后就会从新找一块内存并且将值push到vector中,而原来的内存就可能被释放或者重新分配,这时候,我们的third就变成一个悬空指针了,所以会报错。

遍历Vector中的值

使用for循环遍历:

let v = vec![1, 2, 3];
for i in &v {
    println!("{}", i);
}
//输出
//1
//2
//3

我们也可以修改vector中的值:

let mut v = vec![1, 2, 3];
for i in &mut v {
    *i += 100;
}

for i in v {
    println!("{}", i);
}
// 101
// 102
// 103

Vector+Enum的例子

我们知道vector中只能存放同种数据,那遇到存放不同类型的需求该怎么办呢?

我们在前面学到,enum的变体能够存储不同类型,并且能够附加数据。最重要的是,变体都在同一个enum下,也就是说它们的类型是一致的。

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

let v = vec![
    SpreadSheetCell::Int(22),
    SpreadSheetCell::Float(2.2),
    SpreadSheetCell::Text(String::from("nice demo")),
]; //v: Vec<SpreadSheetCell>

为什么rust需要在编译时就知道vector的值呢?因为vector是存放在heap上,这样可以提前知道需要多少内存。如果类型不同,就有可能遇到某些元素有某个方法,而某些没有。而通过Vector+Enum的组合,rust能够在编译时就知道所有情况。运行时就可以处理了。

相关文章
|
5月前
|
存储 Rust 安全
Rust中的Vector:多值存储的利器
Rust中的Vector:多值存储的利器
|
存储 传感器 Rust
Rust 笔记:Rust 语言中使用 vector(向量)
本文介绍 Rust 语言中的向量,包括向量与数组的区别,向量的相关API的用法等等。
9774 3
|
3月前
|
Rust 安全 Go
揭秘Rust语言:为何它能让你在编程江湖中,既安全驰骋又高效超车,颠覆你的编程世界观!
【8月更文挑战第31天】Rust 是一门新兴的系统级编程语言,以其卓越的安全性、高性能和强大的并发能力著称。它通过独特的所有权和借用检查机制解决了内存安全问题,使开发者既能享受 C/C++ 的性能,又能避免常见的内存错误。Rust 支持零成本抽象,确保高级抽象不牺牲性能,同时提供模块化和并发编程支持,适用于系统应用、嵌入式设备及网络服务等多种场景。从简单的 “Hello World” 程序到复杂的系统开发,Rust 正逐渐成为现代软件开发的热门选择。
66 1
|
9天前
|
Rust 安全 Java
探索Rust语言的并发编程模型
探索Rust语言的并发编程模型
|
15天前
|
Rust 安全 区块链
探索Rust语言:系统编程的新选择
【10月更文挑战第27天】Rust语言以其安全性、性能和并发性在系统编程领域受到广泛关注。本文介绍了Rust的核心特性,如内存安全、高性能和强大的并发模型,以及开发技巧和实用工具,展示了Rust如何改变系统编程的面貌,并展望了其在WebAssembly、区块链和嵌入式系统等领域的未来应用。
|
17天前
|
Rust 安全 Java
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第27天】Rust语言以其独特的特性和优势在编程领域迅速崛起。本文介绍Rust的核心特性,如所有权系统和强大的并发处理能力,以及其性能和安全性优势。通过实战示例,如“Hello, World!”和线程编程,帮助读者快速入门Rust。
34 1
|
18天前
|
Rust 安全 编译器
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第26天】Rust语言诞生于2006年,由Mozilla公司的Graydon Hoare发起。作为一门系统编程语言,Rust专注于安全和高性能。通过所有权系统和生命周期管理,Rust在编译期就能消除内存泄漏等问题,适用于操作系统、嵌入式系统等高可靠性场景。
29 2
|
9天前
|
Rust 安全 前端开发
探索Rust语言的异步编程模型
探索Rust语言的异步编程模型
|
19天前
|
Rust 安全 云计算
Rust语言入门:安全性与并发性的完美结合
【10月更文挑战第25天】Rust 是一种系统级编程语言,以其独特的安全性和并发性保障而著称。它提供了与 C 和 C++ 相当的性能,同时确保内存安全,避免了常见的安全问题。Rust 的所有权系统通过编译时检查保证内存安全,其零成本抽象设计使得抽象不会带来额外的性能开销。Rust 还提供了强大的并发编程工具,如线程、消息传递和原子操作,确保了数据竞争的编译时检测。这些特性使 Rust 成为编写高效、安全并发代码的理想选择。
15 0
|
1月前
|
Rust 安全 网络安全
在 Rust 语言中,寻找企业上网行为管理软件的突破
在数字化企业环境中,上网行为管理软件对于保障网络安全和提升工作效率至关重要。Rust 语言凭借其安全性、高性能和并发性,为开发此类软件提供了新机遇。本文通过几个 Rust 代码示例,展示了如何实现网址检查、访问频率统计及访问控制等功能,旨在探索 Rust 在企业上网行为管理中的应用潜力。
35 0