Rust 数组与向量

数组

数组是单一类型的对象的集合 T, 存储在连续内存中。 它们的大小在编译的时候确定,类型签名的一部分 [T; size].

切片
切片和数组相似,但它们的大小在编译时是不知道的。相反,切片是一个双字对象,第一个字是一个指针中的数据,第二个字是切片的长度。切片可借用数组的截面,并具有式签名 &[T]

声明和初始化数组,示例:

use std::mem;


fn analyze_slice(slice:&[i32]){
    println!("first element of the slice: {}", slice[0]);
    println!("the slice has {} elements", slice.len());
}


fn main() {
    let array1:[i32;5] = [1,2,3,4,5];  //定长数组(类型标记可省略->可自动推断出)
    let array2:[i32;5] = [0;5];        //初始化5个0
    println!("数组1:{:?}",&array1);
    println!("数组2:{:?}",&array2);
    println!("数组1-切片:{:?}",&array1[0..2]);
    println!("数组栈中分配:{}",mem::size_of_val(&array1));

    analyze_slice(&array2[0..=4]);
}
// 数组1:[1, 2, 3, 4, 5]
// 数组2:[0, 0, 0, 0, 0]
// 数组1-切片:[1, 2]
// 数组栈中分配:20
// first element of the slice: 0
// the slice has 5 elements
vector

vector的使用,【标准库】查看

如下依次演示;

  1. 声明与初始化
  2. 添加元素
  3. 弹出元素(删除并返回最后一个元素)
  4. 合并两个vector
  5. vector中存储String
  6. 5vector中(通过枚举类型)存储不同类型的元素
#[derive(Debug)]
enum Data {
    Name(String),
    Age(u8),
    Height(f32),
}


fn main() {
    // 声明并初始化vector,无法动态添加和删除
    let vec0 = vec![1, 2, 3, 4, 5];
    let vec1 = vec!["a", "b", "c"];
    println!("vec0={:?}",vec0);
    println!("vec1={:?}",vec1);

    // 声明动态vector,可添加和删除元素
    let mut vec3: Vec<u32> = Vec::new();
    vec3.push(11);
    vec3.push(12);
    vec3.push(13);
    let x = vec3.pop();
    println!("x={:?}",x);
    println!("vec3={:?}",vec3);
    for i in vec3.iter(){
        println!("元素:{}",i)
    }

    let mut vec4 = Vec::with_capacity(5);  // 初始化向量,声明初始空间
    vec4.push(100);
    vec4.push(101);
    vec4.push(102);
    vec4.push(103);
    
    println!("vec4索引访问依次={},{},{},{}",&vec4[0],&vec4[1],&vec4[2],&vec4[3]);
    println!("获取元素={:?}",vec4.get(0));

    vec4.extend(vec3.iter().copied());
    println!("合并两个vector=>vec4{:?}",vec4);



    let mut names: Vec<String> = Vec::new();
    names.push("zhangsan".to_string());
    names.push("lisi".to_string());
    names.push("wangwu".to_string());

    for name in &names {
        println!("name: {}", name);
    }


    let mut data_sets: Vec<Data> = Vec::new();
    data_sets.push(Data::Name(String::from("wangmazi")));
    data_sets.push(Data::Age(12));
    data_sets.push(Data::Height(177.32));
    for info_ in &data_sets{
        println!("vetor中个人信息依次为:{:?}",info_)
    }
}
// vec0=[1, 2, 3, 4, 5]
// vec1=["a", "b", "c"]
// x=Some(13)
// vec3=[11, 12]
// 元素:11
// 元素:12

// vec4索引访问依次=100,101,102,103
// 获取元素=Some(100)

// 合并两个vector=>vec4[100, 101, 102, 103, 11, 12]

// name: zhangsan
// name: lisi
// name: wangwu

// vetor中个人信息依次为:Name("wangmazi")
// vetor中个人信息依次为:Age(12)
// vetor中个人信息依次为:Height(177.32)

关于String与&str 【标准库】
或者查看:https://blog.csdn.net/wowotuo/article/details/73729054

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongpingWang

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值