Rust基础 常见容器

本文介绍了Rust编程中的三种常见容器:向量、字符串和哈希表。向量是动态长度的堆内存结构,支持添加、读取和删除元素;字符串是UTF-8编码的,提供了多种创建和更新方式;哈希表则用于存储键值对,通过哈希函数快速访问。文章详细阐述了它们的使用方法、所有权规则以及迭代器的使用技巧。
摘要由CSDN通过智能技术生成

常见容器

这部分主要介绍Rust中的向量Vec<T>、字符串和哈希表。

向量Vec<T>

向量和数组的最大区别在于,数组的长度必须在编译时确定,而且之后长度不能更改,所以数组使用的是栈内存,而向量的长度是动态的,可以在运行时增加或减少,因此使用的是堆内存。

创建向量

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

这种创建方式必须指定向量类型。

fn main() {
    let vec = vec![1, 2, 3];
    let vec = vec![0; 5]; // [0, 0, 0, 0, 0]
}

这种创建方式可以根据数据自动推断出向量类型。

添加元素

fn main() {
    let vec: Vec<i32> = Vec::new();
    vec.push(0);
}

读取元素

直接利用索引读取,如下:

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

当访问越界时,比如vec[4],在运行时会panic。也可以使用get方法读取,它返回的是Option<T>类型,如果访问越界,返回的是None,否则返回的是Some,因此需要结合match {}进行处理。

fn main() {
    let vec = vec![1, 2, 3, 4];
    let index = 4;
    match vec.get(index) {
        Some(v) => println!("{}", v),
        None => println!("None"),
    }
}

向量元素的引用和向量的引用

Vec<T>push方法需要修改向量,因此push方法的参数是&mut self,如果获得了向量中元素的引用,那么就不再允许调用push方法,因为会违背引用的规则:任意时刻只能存在一个可变引用或者多个不可变引用。

fn main() {
    let mut vec = vec![1, 2, 3, 4];
    let ele = &vec[3];
    vec.push(5); 
}

// 报错信息
// 3 |     let ele = &vec[3];
//   |                --- immutable borrow occurs here
// 4 |     vec.push(5); 
//   |     ^^^^^^^^^^^ mutable borrow occurs here
// 5 |     println!("{}", ele);
//   |                    --- immutable borrow later used here

如果向量中的元素没有实现Copy特性,比如Vec<String>,那么let x = vec[0];会移动向量中元素的所有权,导致移动后vec[0]就会不存在,而Rust不允许这种情况出现,如下:

fn main() {
	let vec = vec![String::from("hello"), String::from("world")];
	let x = vec[0];
}

// 报错信息
// 3 |     let x = vec[0];
//   |             ^^^^^^
//   |             |
//   |             move occurs because value has type `String`, which does not implement the `Copy` trait
//   |             help: consider borrowing here: `&vec[0]`

如提示,可以通过引用访问元素,let x = &vec[0];,也可以通过get方法访问元素,这种情况下,返回的是引用,如下:

fn main() {
	let vec = vec![String::from("hello"), String::from("world")];
	let x = vec.get(0); // x是&String类型 
}

删除向量

当向量离开作用域后,会调用drop方法释放向量占用的资源,同时,向量中的元素也会调用drop方法释放资源。

使用迭代器访问元素

如果不改变向量中的元素,如下:

fn main() {
    let vec = vec![1, 2, 3, 4];
    for
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值