做论坛网站需要多少钱,绵阳市建设局官方网站,wordpress文章添加标签居中,怎么样查中企动力做的网站导航 一、动态数组是什么#xff0c;怎么用1、动态数组Vector是什么2、动态数组怎么用#xff08;1#xff09;创建动态数组#xff08;2#xff09;尾部追加元素#xff08;3#xff09;尾部删除元素#xff08;4#xff09;删除指定位置元素#xff08;5#xff0… 导航 一、动态数组是什么怎么用1、动态数组Vector是什么2、动态数组怎么用1创建动态数组2尾部追加元素3尾部删除元素4删除指定位置元素5清除所有元素6遍历所有元素和遍历并修改元素7读取Vector元素8Vector整体和内部的某个元素需要遵守借用规则9Vector存储不同类型的数据10Vector排序11字符串转Vector 一、动态数组是什么怎么用
1、动态数组Vector是什么
动态数组类型用 Vec 表示可以看成java的集合吧和Golang的切片还是有点区别。
动态数组允许你存储多个值顺序存储访问效率高但是只能存储相同类型的元素。
其实如果你想放不同类型的数据可以考虑枚举或者特征对象
2、动态数组怎么用
1创建动态数组
let v: Veci32 Vec::new();或者
let v vec![1, 2, 3];或者
let v Vec::from([1,2,3]);2尾部追加元素
let mut v Vec::new();
v.push(1);3尾部删除元素
fn main() {// 填空let arr [1, 2, 3];let mut v Vec::from(arr);let end:Optioni32v.pop();//会返回弹出的值
}4删除指定位置元素
let mut v vec![1, 2];
assert!(!v.is_empty()); // 检查 v 是否为空v.insert(2, 3); // 在指定索引插入数据索引值不能大于 v 的长度 v: [1, 2, 3]
assert_eq!(v.remove(1), 2); // 移除指定位置的元素并返回, v: [1, 3]5清除所有元素
v.clear();6遍历所有元素和遍历并修改元素
let v vec![1, 2, 3];
for i in v {//注意要是借用不然v就会丢失所有权。println!({i});
}let mut v vec![1, 2, 3];
for i in mut v {*i 10
}
7读取Vector元素
分为下标访问和get访问
let v vec![1, 2, 3, 4, 5];let third: i32 v[2];
println!(第三个元素是 {}, third);match v.get(2) {Some(third) println!(第三个元素是 {third}),None println!(去你的第三个元素根本没有),
}
//模式匹配也可以写成if let
if let Some(third) v.get(2) {println!(第三个元素是 {third});
} else {println!(去你的第三个元素根本没有);
}v.get(2) 也是访问第三个元素但是有所不同的是它返回了 OptionT因此还需要额外的 match 来匹配解构出具体的值。
从安全性出发get更安全get在内部做了处理有值的时候返回 Some(T)无值的时候返回 None因此 v.get 的使用方式非常安全。
8Vector整体和内部的某个元素需要遵守借用规则
哪怕只是拿了某个元素的可变引用也不能再获得Vector整体的不可变引用
let mut v vec![1, 2, 3, 4, 5];let first v[0];v.push(6);println!(The first element is: {first});
9Vector存储不同类型的数据
如果是特征对象得保证不同类型都实现了相同特征
trait IpAddr {fn display(self);
}struct V4(String);
impl IpAddr for V4 {fn display(self) {println!(ipv4: {:?},self.0)}
}
struct V6(String);
impl IpAddr for V6 {fn display(self) {println!(ipv6: {:?},self.0)}
}fn main() {let v: VecBoxdyn IpAddr vec![Box::new(V4(127.0.0.1.to_string())),Box::new(V6(::1.to_string())),];for ip in v {ip.display();}
}10Vector排序
整数数组排序
fn main() {let mut vec vec![1, 5, 10, 2, 15]; vec.sort_unstable(); assert_eq!(vec, vec![1, 2, 5, 10, 15]);
}浮点数排序
fn main() {let mut vec vec![1.0, 5.6, 10.3, 2.0, 15f32]; vec.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap()); assert_eq!(vec, vec![1.0, 2.0, 5.6, 10.3, 15f32]);
}结构体排序 能比较的前提是结构体字段实现了排序比较相关的特征如果不想自己写可以使用派生的比较特征
#[derive(Debug)]
struct Person {name: String,age: u32,
}impl Person {fn new(name: String, age: u32) - Person {Person { name, age }}
}fn main() {let mut people vec![Person::new(Zoe.to_string(), 25),Person::new(Al.to_string(), 60),Person::new(John.to_string(), 1),];// 定义一个按照年龄倒序排序的对比函数people.sort_unstable_by(|a, b| b.age.cmp(a.age));println!({:?}, people);
}11字符串转Vector let s hello.to_string();let v1: Vecu8 s.into();let s hello.to_string();let v2 s.into_bytes();