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能够在编译时就知道所有情况。运行时就可以处理了。

相关文章
|
3月前
|
存储 Rust 安全
Rust中的Vector:多值存储的利器
Rust中的Vector:多值存储的利器
|
存储 传感器 Rust
Rust 笔记:Rust 语言中使用 vector(向量)
本文介绍 Rust 语言中的向量,包括向量与数组的区别,向量的相关API的用法等等。
9744 3
|
21天前
|
Rust 安全 Go
揭秘Rust语言:为何它能让你在编程江湖中,既安全驰骋又高效超车,颠覆你的编程世界观!
【8月更文挑战第31天】Rust 是一门新兴的系统级编程语言,以其卓越的安全性、高性能和强大的并发能力著称。它通过独特的所有权和借用检查机制解决了内存安全问题,使开发者既能享受 C/C++ 的性能,又能避免常见的内存错误。Rust 支持零成本抽象,确保高级抽象不牺牲性能,同时提供模块化和并发编程支持,适用于系统应用、嵌入式设备及网络服务等多种场景。从简单的 “Hello World” 程序到复杂的系统开发,Rust 正逐渐成为现代软件开发的热门选择。
37 1
|
1月前
|
Rust 安全 编译器
初探 Rust 语言与环境搭建
Rust 是一门始于2006年的系统编程语言,由Mozilla研究员Graydon Hoare发起,旨在确保内存安全而不牺牲性能。通过所有权、借用和生命周期机制,Rust避免了空指针和数据竞争等问题,简化了并发编程。相较于C/C++,Rust在编译时预防内存错误,提供类似C++的语法和更高的安全性。Rust适用于系统编程、WebAssembly、嵌入式系统和工具开发等领域。其生态系统包括Cargo包管理器和活跃社区。学习资源如&quot;The Book&quot;和&quot;Rust by Example&quot;帮助新手入门。安装Rust可通过Rustup进行,支持跨平台操作。
102 2
初探 Rust 语言与环境搭建
|
21天前
|
Rust 安全 程序员
Rust 语言的防错机制太惊人了!安全编码从此不再是难题,快来一探究竟!
【8月更文挑战第31天】《安全编码原则:Rust 语言中的防错机制》探讨了代码安全的重要性,并详细介绍了Rust语言如何通过内存安全模型、所有权与借用规则等特性,在编译阶段检测并阻止潜在错误,如缓冲区溢出和悬空指针。文章还讨论了类型安全、边界检查等其他安全特性,并提出了遵循不可变引用、避免裸指针及充分测试等实用编码原则,以进一步提升代码质量和安全性。随着Rust在软件开发中的应用日益广泛,掌握其安全编码原则变得尤为重要。
31 0
|
21天前
|
Rust 安全 调度
从零构建梦想操作系统:用Rust语言亲手打造专属内核,你也可以成为系统开发者!
【8月更文挑战第31天】开发操作系统内核虽具挑战,却也充满乐趣。本文将指导你从零开始,使用Rust语言构建一个简单的操作系统内核。首先安装Rust环境和交叉编译工具链,然后创建新项目`my_kernel`。通过修改`Cargo.toml`和编写启动函数,结合串口输出和`multiboot2`库,最终使用QEMU运行内核。此教程旨在帮助你理解Rust在系统开发中的应用,激发深入探索的兴趣。
37 1
|
21天前
|
Rust 安全 算法
揭秘Rust语言如何重塑区块链安全:打造坚不可摧的分布式账本新篇章!
【8月更文挑战第31天】自比特币诞生以来,区块链技术凭借其去中心化和不可篡改的特点备受关注。为了应对安全性挑战,Rust 语言凭借其内存安全特性逐渐成为区块链开发的优选。本文探讨了 Rust 如何助力区块链实现更安全的分布式账本。通过示例展示了 Rust 在避免内存泄漏、空指针引用及数据竞争等方面的优势,预示着 Rust 在高性能、高安全性需求的区块链应用中拥有广阔前景。
32 1
|
19天前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
20天前
|
开发者 vr&ar 机器学习/深度学习
Xamarin 开发者的未来趋势展望:掌握跨平台开发新机遇,引领移动应用创新潮流与技术变革方向
【8月更文挑战第31天】Xamarin 作为领先的跨平台开发框架,通过 C# 和 .NET 框架实现一次编写、多平台运行,简化了 iOS、Android 和 Windows 应用的开发流程。未来几年,Xamarin 开发者将面临跨平台开发普及、云集成、机器学习、AR/VR、性能优化及安全性等关键趋势。通过学习新技术并积极采用新工具,开发者能够提升应用质量和用户体验,如利用 Azure AD B2C 实现身份认证,从而在竞争激烈的市场中脱颖而出。
40 0
|
20天前
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
29 0