Rust 动态数组Vector

导航

一、动态数组是什么,怎么用

1、动态数组Vector是什么

动态数组类型Vec 表示,可以看成java的集合吧,和Golang的切片还是有点区别。

动态数组允许你存储多个值,顺序存储 ,访问效率高,但是只能存储相同类型的元素。

其实如果你想放不同类型的数据,可以考虑枚举 或者特征对象

2、动态数组怎么用

(1)创建动态数组

rust 复制代码
let v: Vec<i32> = Vec::new();

或者

rust 复制代码
let v = vec![1, 2, 3];

或者

rust 复制代码
let v = Vec::from([1,2,3]);

(2)尾部追加元素

rust 复制代码
let mut v = Vec::new();
v.push(1);

(3)尾部删除元素

rust 复制代码
fn main() {
    // 填空
    let arr = [1, 2, 3];
    let mut v = Vec::from(arr);
    let end:Option<i32>=v.pop();//会返回弹出的值
}

(4)删除指定位置元素

rust 复制代码
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)清除所有元素

rust 复制代码
v.clear();

(6)遍历所有元素和遍历并修改元素

rust 复制代码
let v = vec![1, 2, 3];
for i in &v {//注意要是借用,不然v就会丢失所有权。
    println!("{i}");
}
rust 复制代码
let mut v = vec![1, 2, 3];
for i in &mut v {
    *i += 10
}

(7)读取Vector元素

分为下标访问和get访问

rust 复制代码
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) 也是访问第三个元素,但是有所不同的是,它返回了 Option<&T> ,因此还需要额外的 match 来匹配解构出具体的值

从安全性出发,get更安全,get在内部做了处理,有值的时候返回 Some(T),无值的时候返回 None,因此 v.get 的使用方式非常安全。

(8)Vector整体和内部的某个元素,需要遵守借用规则

哪怕只是拿了某个元素的可变引用,也不能再获得Vector整体的不可变引用

rust 复制代码
let mut v = vec![1, 2, 3, 4, 5];

let first = &v[0];

v.push(6);

println!("The first element is: {first}");

(9)Vector存储不同类型的数据

如果是特征对象,得保证不同类型都实现了相同特征

rust 复制代码
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: Vec<Box<dyn IpAddr>> = vec![
        Box::new(V4("127.0.0.1".to_string())),
        Box::new(V6("::1".to_string())),
    ];

    for ip in v {
        ip.display();
    }
}

(10)Vector排序

整数数组排序

rust 复制代码
fn main() {
    let mut vec = vec![1, 5, 10, 2, 15];    
    vec.sort_unstable();    
    assert_eq!(vec, vec![1, 2, 5, 10, 15]);
}

浮点数排序

rust 复制代码
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]);
}

结构体排序

能比较的前提是,结构体字段实现了排序比较相关的特征,如果不想自己写,可以使用派生的比较特征

rust 复制代码
#[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

rust 复制代码
    let s = "hello".to_string();
    let v1: Vec<u8> = s.into();

    let s = "hello".to_string();
    let v2 = s.into_bytes();
相关推荐
程序员Sunday7 分钟前
为什么 AI 明明写后端更爽,但却都网传 AI 取代前端,而不是 AI 取代后端?就离谱...
前端·后端
程序员西西12 分钟前
深入剖析 Java 中的 ZGC 机制:原理、优势与实践
java·后端·算法
海上彼尚14 分钟前
Go之路 - 4.go的集合[完整版]
开发语言·后端·golang
卡尔AI工坊16 分钟前
万众瞩目的 GPT 5.2,连个火柴人游戏都做不明白?
后端·算法
coding随想20 分钟前
JavaScript Notifications API:告别alert弹窗,开启沉浸式用户体验革命!
开发语言·javascript·ux
阿海57420 分钟前
卸载php的shell脚本
开发语言·php
码界奇点28 分钟前
基于Python与GitHub Actions的正方教务成绩自动推送系统设计与实现
开发语言·python·车载系统·自动化·毕业设计·github·源代码管理
哈哈哈笑什么29 分钟前
Spring Boot接口国际化异常信息方案
java·spring boot·后端
qq_1629876929 分钟前
SpringBoot框架选型
java·spring boot·后端
kaikaile199540 分钟前
MATLAB计算卫星星下点轨迹
开发语言·算法·matlab