文章目录
- 一、元组(tuple)
- 1.元组定义
- 2.元组使用
- 解构
- 索引
- 3.元组修改
- 非可变元组
- 可变元组
- 类型不一致
- 二、数组
- 1.数组
- 不可变数组定义
- 可变数组定义
- 数组使用
- 数组修改
- 数组的遍历
- 2.动态数组-向量(Vector)
- 向量定义
- 向量遍历
- 向量追加
- 向量插入
- 向量删除
- remove方法
- pop方法-删除最好一个元素
- truncate方法-缩减向量
- clear方法-清空向量
- drain方法-删除范围内向量
- 向量排序
- sort方法
- sort_by方法
- 逆转向量
Rust官方文档
针对集合Rust提供了两种复合数据类型,元组和数组。
一、元组(tuple)
元组(tuple)是一种复合数据类型,可以包含不同类型的元素,但一旦定义,元组长度不可变的。
1.元组定义
# 标准定义
fn main() {let tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");
}
# 也可省略类型
fn main() {let tup= (500, 6.4, 1, "hello");
}
2.元组使用
Rust中使用元组数据有两种方法。
- 解构 即将一个元组拆成多个部分,每个部分赋值给一个变量
- 索引 即使用’.'配合索引进行使用
解构
fn main() {let tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");let (a,b,c,d) = tup;println!("a={0},b={1},c={2},d={3}",a,b,c,d);
}
$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.34sRunning `target/debug/hello hello`
a=500,b=6.4,c=1,d=hello
索引
fn main() {let tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");println!("a={0},b={1},c={2},d={3}",tup.0,tup.1,tup.2,tup.3);
}
$argo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.31sRunning `target/debug/hello hello`
a=500,b=6.4,c=1,d=hello
3.元组修改
理论上元组是不能进行修改的,但是如果定义为可变元组,则可以修改元组内容,但修改值的类型必须和定义时一致。
特别注意:元组长度始终无法修改
非可变元组
fn main() {let tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");println!("value:{}",tup.0);tup.0 = 1000;println!("After:{}",tup.0);
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)
error[E0594]: cannot assign to `tup.0`, as `tup` is not declared as mutable--> src/main.rs:4:5|
4 | tup.0 = 1000;| ^^^^^^^^^^^^ cannot assign|
help: consider changing this to be mutable|
2 | let mut tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");| +++For more information about this error, try `rustc --explain E0594`.
error: could not compile `hello` (bin "hello") due to previous error
可变元组
fn main() {let mut tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");println!("value:{}",tup.0);tup.0 = 1000;println!("After:{}",tup.0);
}
$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.22sRunning `target/debug/hello hello`
value:500
After:1000
类型不一致
fn main() {let mut tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");println!("value:{}",tup.0);tup.0 = "what?";println!("After:{}",tup.0);
}
$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)
error[E0308]: mismatched types--> src/main.rs:4:13|
4 | tup.0 = "what?";| ----- ^^^^^^^ expected `i32`, found `&str`| || expected due to the type of this bindingFor more information about this error, try `rustc --explain E0308`.
error: could not compile `hello` (bin "hello") due to previous error
二、数组
目前据我所知,Rust中可以称为数组的有可变数组、不可变数组和向量.
- 数组只能是单一数据类型的合集,比元组多了遍历的功能
- 向量与数组一样,是单一数据类型的合计,但是比数组强大太多,具有增、删、插入、排序等操作
1.数组
不可变数组定义
# 标准定义方法
fn main() {let a: [i32; 5] = [1, 2, 3, 4, 5];
}=> a =[1, 2, 3, 4, 5]
# 简化类型定义方法
fn main() {let a = [1, 2, 3, 4, 5];
}=> a =[1, 2, 3, 4, 5]
# 相同初始值定义方法
fn main() {let a = [3; 5];
}=> a =[3, 3, 3, 3, 3]
可变数组定义
定义方法与不可变数组一致,只是加了
mut
关键字
fn main() {let mut v: [i32; 5] = [3;5];
}=> a =[3, 3, 3, 3, 3]
数组使用
可以利用数组名[下标]的方式对数组内容进行使用,数组内下标从0计算。
fn main() { let array = [1, 2, 3, 4, 5]; println!("Second value:{:?}", array[1]);
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.24sRunning `target/debug/hello hello`
Second value:2
数组修改
fn main() { let mut array = [1, 2, 3, 4, 5]; println!("value :{:?}", array); array[2] = 100;println!("After :{:?}", array);
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.22sRunning `target/debug/hello hello`
value :[1, 2, 3, 4, 5]
After :[1, 2, 100, 4, 5]
数组的遍历
# 值遍历
fn main() { let array = [1, 2, 3, 4, 5]; for i in array{println!("{}",i);}
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.24sRunning `target/debug/hello hello`
1
2
3
4
5# 下标遍历
fn main() { let array = [1, 2, 3, 4, 5]; for i in 0..5{println!("{}",array[i]);}
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.21sRunning `target/debug/hello hello`
1
2
3
4
5
2.动态数组-向量(Vector)
Rust中的向量(Vector)是一种动态数组,它可以存储相同类型的元素,并且其大小可以在运行时增长或缩小。
向量定义
let mut v1 = Vec::new(); // 创建一个空的向量
let v2 = vec![1, 2, 3]; // 创建一个包含初始元素的向量
向量遍历
fn main() { let v = vec![1, 2, 3]; for i in &v { println!("{}", i); }
}
向量追加
fn main() { let mut v = Vec::new();v.push(1);v.push(2);v.push(3);println!("{:?}",v);
}$cargo run helloFinished dev [unoptimized + debuginfo] target(s) in 0.00sRunning `target/debug/hello hello`
[1, 2, 3]
向量插入
fn main() { let mut vec = vec![1, 2, 4, 5]; vec.insert(2, 3); // 在索引2的位置插入元素3 println!("{:?}", vec);
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.26sRunning `target/debug/hello hello`
[1, 2, 3, 4, 5]
向量删除
remove方法
fn main() { let mut vec = vec![1, 2, 3, 4, 5]; let removed_element = vec.remove(2); // 删除索引2处的元素 println!("Removed element: {}", removed_element); // 输出: Removed element: 3 println!("{:?}", vec); // 输出: [1, 2, 4, 5]
}
pop方法-删除最好一个元素
fn main() { let mut vec = vec![1, 2, 3];vec.pop();println!("{:?}", vec); // 输出: [1, 2]
}
truncate方法-缩减向量
fn main() { let mut vec = vec![1, 2, 3, 4, 5]; vec.truncate(3); // 缩减向量的大小为3 println!("{:?}", vec); // 输出: [1, 2, 3]
}
clear方法-清空向量
fn main() { let mut vec = vec![1, 2, 3, 4, 5]; vec.clear(); // 删除所有元素 println!("{:?}", vec); // 输出: []
}
drain方法-删除范围内向量
fn main() { let mut vec = vec![1, 2, 3, 4, 5]; let drained: Vec<_> = vec.drain(1..3).collect(); // 删除索引1到2的元素(不包括3)并收集它们 println!("Drained elements: {:?}", drained); // 输出: Drained elements: [2, 3] println!("{:?}", vec); // 输出: [1, 4, 5]
}
向量排序
sort方法
fn main() { let mut numbers = vec![5, 2, 9, 1, 5, 6]; numbers.sort(); println!("{:?}", numbers); // 输出: [1, 2, 5, 5, 6, 9]
}
sort_by方法
# 升序
fn main() { let mut numbers = vec![5, 2, 9, 1, 5, 6]; numbers.sort_by(|a, b| a.cmp(b)); println!("{:?}", numbers); // 输出: [1, 2, 5, 5, 6, 9]
}
# 降序
fn main() { let mut numbers = vec![5, 2, 9, 1, 5, 6]; numbers.sort_by(|a, b| b.cmp(a)); println!("{:?}", numbers); // 输出: [9, 6, 5, 5, 2, 1]
}
逆转向量
fn main() { let mut numbers = vec![1, 2, 3, 4, 5]; numbers.reverse(); println!("{:?}", numbers); // 输出: [5, 4, 3, 2, 1]
}