Rust 入门 常用集合

Rust 中常见的集合

向量(vector)

允许我们一个挨着一个地储存一系列数量可变的值

  • 由标准库提供
  • 可储存多个值
  • 存储的值必须是相同数据类型
  • 值在内存中是连续存放的

创建 vector

fn main() {
    // 使用构造函数创建
    let v1: Vec<i32> = Vec::new();
    // 使用宏创建带有初始值的向量
    let v2 = vec![1, 2, 3];
}

向 vector 中添加数据

fn main() {
    // 向 vector 中添加数据时, vector 必须是可变的
    let mut v: Vec<i32> = Vec::new();
    v.push(1);
    v.push(3);
    v.push(5);
    v.push(7);
}

删除 vector 中的数据

fn main() {
    let mut v = vec![1, 2, 3];
    println!("{:?}", v);
    v.remove(0); // 删除索引为0的值
    println!("{:?}", v);
}

访问 vector 中的数据

fn main() {
    let v = vec![1, 2, 3];
    // 使用下标直接访问
    println!("{}", v[0]);
    // 使用get方法访问
    if let Option::Some(value) = v.get(0) {
        println!("{}", value);
    }
}

例子

enum TableCell {
    Int(i32),
    Float(f64),
    Text(String),
}

use TableCell::*;

fn main() {
    let row = vec![
        Int(3),
        Float(3.14),
        Text(String::from("π"))
    ];
}

字符串(string)

字符串是字符的集合

  • String 是 byte 的集合, 在 Rust 中的表现形式为 u8

字符串是什么?

  • 在 Rust 的核心语言层面, 只有一个字符串类型: 字符串切片(str&str)
  • 字符串切片: 对于存储在其他地方的UTF8编码的字符串的引用
  • 字符串字面值: 存储在二进制程序中的, 属于字符串切片

字符串类型是什么?

  • 字符串类型来自标准库而不是核心语言层面
  • 可增长, 可修改, 可拥有所有权
  • 使用UTF8编码

Rust 中的字符串指的是什么?

  • String 和 &str

创建 String

fn main() {
    // 一般情况下我们不会采用new的方式创建String
    // 大多数情况下我们会使用初始值创建String
    let mut s = String::new();
}

从初始值创建String

  • 需要实现了 Display 这个 trait 的类型
  • 我们常用的&str就实现了这个 trait
fn main() {
    let s1 = "hello";
    let s2 = s1.to_string();
    let ss = String::from(s1);
}

向String中添加数据

fn main() {
    let s = "hello";
    let mut s = s.to_string();
    s.push_str(" world");
    s.push('!');
    println!("{}", s);
}

拼接字符串

use std::ops::Add;

fn main() {
    // demo 1
    let hello = String::from("Hello");
    let world = String::from("World");
    let s = hello + &world;
    println!("{}", s);

    // demo 2
    let hello = String::from("Hello");
    let world = String::from("World");
    let s = hello.add(&world);
    println!("{}", s);

    // demo 3
    let who = String::from("小明");
    let site = String::from("厕所");
    let work = String::from("吃饭");
    let result = format!("{}在{}{}", &who, &site, &work);
    println!("{}", result);
}

访问String中的数据

fn main() {
    let s = String::from("你好");
    println!("字符串的长度: {}", s.len());
    // 我们可以看到输出的结果为 6
    // 在 UTF8 编码中, 字符串中的单个字符并不一定是占用一个字节的
    // Rust 为了避免出错, 不允许使用索引的方式访问字符串中的数据

    println!("\n标量");
    for char in s.chars() {
        println!("{}", char);
    }

    println!("\n字节");
    for byte in s.bytes() {
        println!("{}", byte);
    }
    
}

切割String

fn main() {
    let s = String::from("你好");
    // 这一行会报错, 不能切割String
    println!("{}", s[..3]);
    // 但是我们可以切割字符串切片
    println!("{}", &s[..3]);
}

哈希集合(hash map)

哈希集合允许我们将值与一个特定的键相关联

  • 键值对的形式储存数据, 一个(key)对应一个(value)

创建 HashMap

use std::collections::HashMap;

fn main() {
    let mut map: HashMap<i32, String> = HashMap::new();
}

向 HashMap 中插入数据

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert(1, "关注".to_string());
    map.insert(2, "推荐".to_string());
    map.insert(3, "收藏".to_string());
    map.insert(4, "转发".to_string());
}

访问 HashMap 中的数据

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert(1, "关注".to_string());
    map.insert(2, "推荐".to_string());
    map.insert(3, "收藏".to_string());
    map.insert(4, "转发".to_string());
    if let Some(value) = map.get(&1) {
        println!("{}", value);
    }
}

遍历 HashMap 中的数据

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert(1, "关注".to_string());
    map.insert(2, "推荐".to_string());
    map.insert(3, "收藏".to_string());
    map.insert(4, "转发".to_string());

    for (k, v) in &map {
        println!("key:{} value:{}", k, v);
    }
}

更新 HashMap 数据

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert(1, "关注".to_string());
    map.insert(2, "推荐".to_string());
    map.insert(3, "收藏".to_string());

    // 覆盖原有的值
    map.insert(1, "记得关注".to_string());

    // 忽略新的值
    map.entry(2).or_insert("记得推荐".to_string());

    for (k, v) in &map {
        println!("key:{} value:{}", k, v);
    }
}
如果对我分享的内容感兴趣的话  记得关注我得动态
求推荐  求收藏  求转发  求关注
posted @ 2021-06-22 20:44  Delayer  阅读(117)  评论(0编辑  收藏  举报