rust学习九.1、集合之向量
一、纲要
定义
1. new Vec::new();
2. 采用宏 vec![1, 2, 3];
操作
0.读取 索引语法或者 get 方法 ,注意索引从0开始. vec[0]或者vec.get(0)
vec[i] 不会改变所有权,但如果发生越界,则会导致程序终止
get(i) 返回的是一个Option类型,同样不会改变所有权。越界放回None
rust也要照顾到大家的习惯,不要读取一个索引就改变所有权。如果是那样实在太麻烦了。
1.添加 push ,添加都尾部
2.修改 vec[0] = 10;
3.删除 pub,remove
4.遍历
a. 简单语法 for i in &vec {}
b. 迭代器 for i in vec.iter() {}
c. for+get for i in 0..vec.len() { let e = &v[i]; }
向量和枚举
利用枚举的特性,而已让向量存储不同类型的数据,这是因为枚举允许不同成员有不同类型的数据。
应该没有什么人会这么搞吧? rust还是有对应措施,使得有基本上可以匹配java的List<Object>的类型存在。
二、示例
fn main() { //1.0 定义 let mut height_arr: Vec<i32> = Vec::new(); //1.1 宏定义 let mut arr = vec![1, 2, 3]; //2.0 添加元素 height_arr.push(130); height_arr.push(135); height_arr.push(140); height_arr.push(142); height_arr.push(145); height_arr.push(150); height_arr.push(160); println!("{:?} 共有{}个元素", height_arr,height_arr.len()); //2.1 访问具体元素- 常规的方法不会导致所有权转移 let a1 = height_arr[0]; let a2= height_arr.get(1).unwrap(); println!("a1={},a2={}", a1,a2); //2.2 使用索引访问,测试越界访问。这会导致程序异常,并终止 //如果是get越界,会返回None //thread 'main' panicked at xx.rs:52:24: //index out of bounds: the len is 7 but the index is 10 println!("访问越界元素"); //let a3 = height_arr[10]; //这会导致程序异常,并终止 let a3= height_arr.get(10); if let None = a3 { println!("不存在第11个元素:{}","None"); } //3.0 修改元素 height_arr[0] = 131; //4.0 删除元素 height_arr.pop(); //移除最后一个元素 println!("{:?} 移除一个后,还有{}个元素", height_arr,height_arr.len()); //5.0 遍历 //5.1 简单语法 println!("遍历一、简单语法遍历向量,所有权转移"); //for i in height_arr 这样会导致所有权转移 //这里必须使用引用,否则用过之后,所有都转移了。后续要是再使用则会报错 for i in &height_arr { println!("{}", i); } //5.2 迭代器-这个方式不会改变所有权,后面可以继续使用原来的变量 println!("遍历二、迭代器遍历向量,所有权不转移"); for i in height_arr.iter() { println!("{}", i); } //5.3 for+get // 索引法和get方法都不会导致所有权转移,所以可以继续使用原来的变量 println!("遍历三、for+索引遍历向量,所有权不转移"); for i in 0..height_arr.len() { let e = height_arr[i]; let b = height_arr.get(i); println!("{},{:?}", e,b); } }
rust-script 执行下,结果如下:
三、小结
1.长度可变,容量自动管理
2.元素类型必须相同
3.可存放任何类型数据,包括引用
4.某种情况下,类似java的List,但比java的List差,因为java的List可以存储不同类型成员
5. 向量具有许多的方法,需要自行去看api文档,无法一一列出,也没有必要。
rust的向量的api文档 https://doc.rust-lang.org/std/vec/struct.Vec.html