Rust学习——常见集合,Vec、String、HashMap

一、vector

特点:一个挨着一个地存储一系列数量可变的值。

只能存储相同类型的值。

它在内存中彼此相邻地排列所有的值。

常见场景:文件中的文本,购物车中商品的价格。

vector是用泛型实现的。

let v: Vec = Vec::new();

let v = vec![1, 2, 3,];

使用push方法更新值。

释放vec时会丢弃其所有元素。

如何读取vector元素值?

  1. 索引语法,即通过index访问,类似数组
  2. get方法,返回一个Option<&T>,所以通过match运算符去处理。

第一种获取元素的方法需要注意越位,会引起程序崩溃。即panic。

第二种则能很友好的在None的情况处理。

由于在同一作用域下不能同时存在可变和不可变引用,所以在获取vector元素的不可变引用时尝试在vector末尾增加元素,则会抛出异常。

在使用+=运算符之前必先用解引用运算符(*)获取i中的值。

vector + 枚举可以在vector中存放不同类型的数据。

二、字符串

特点:字符的集合。String。

let s = "initial contents".to_string();

// equal to

let s = String::from("initial contents");

Rust中字符串使用的是UTF-8编码。

如何更新字符串?

1. push_str,该方法不会获取到入参的所有权

2. push,该方法入参仅支持单个字符

3. + 运算符,String只能和&str 相加。

4. format! 宏,对于复杂的字符串处理,使用该方法最方便了,并且不会获取任何参数的所有权

当把一个类型为String的字符串取引用,并与类型为String的字符串相加时,第一个类型会被Deref强制转换成&str。

let s1 = String::from("tic");

let s2 = String::from("tac");

let s3 = String::from("toe");

let s = format!("{}-{}-{}", s1, s2, s3);

Rust字符串String本质上是一个Vec的封装。

Rust中可以用三种方式可以理解字符串:

  1. 字节
  2. 标量值
  3. 字形簇(字母)

遍历字符串的方法:

1. .chars()

2. .bytes()

3. 获取字形簇可考虑crate.io上三方库

三、hash map

特点:允许将值与一个特定的键key关联,使用map数据结构。

生成一个map的方式:

use std::collections ::HashMap;

let mut scores = HashMap::new();

另一种方式:

use std::collections ::HashMap;

let teams = vec![String:: from("Blue"), String::from("Yellow")];

let initial_scores = vec![10, 50];

let scores: HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();

通过.get(key)方法可返回一个Option<&T>,所以通过match运算符去处理。

类似于 vector,hash map 是同质的:所有的键必须是相同类型,值也必须都是相同类型

hash map与所有权

如果将值的引用插入哈希 map,这些值本身将不会被移动进哈希 map。但是这些引用指向的值必须至少在哈希 map 有效时也是有效的。

更新hash map

  1. 覆盖:
    1. 再次插入相同的key,即覆盖
  2. 只在键无对应值时插入:
    1. 使用.entry(key).or_insert(value)方法
    2. 使用此方法可快速依据可迭代结构更新hash map,并获取具体的键值
  3. 在旧值基础上更新值:
    1. 将一个键值取出来后,使用*号解引用,然后进行赋值操作即可完成更新