在 Rust 程序中被广泛使用的集合: :::warning

  • vector 允许我们一个挨着一个地储存一系列数量可变的值
  • 字符串(string)是字符的集合。我们之前见过 String 类型,不过在本章我们将深入了解。
  • 哈希 map(hash map)允许我们将值与一个特定的键(key)相关联。这是一个叫做 map 的更通用的数据结构的特定实现。 ::: https://doc.rust-lang.org/std/collections/index.html

    应用场景

    在以下情况下使用Vec:

    https://doc.rust-lang.org/std/vec/index.html

  • 您希望收集项目,以便稍后处理或发送到其他位置,并且不关心所存储的实际值的任何属性。

  • 您需要一系列元素按特定顺序排列,并且只会追加到(或接近)末尾。
  • 你想要一个堆栈。
  • 您需要一个可调整大小的数组。
  • 您需要一个堆分配的数组。

    在以下情况下使用VecDeque:

  • 您需要一个支持在序列两端高效插入的 Vec

  • 您需要一个队列。
  • 您需要一个双端队列 (deque)。

    在以下情况下使用LinkedList:

  • 您想要未知大小的 VecVecDeque,并且不能容忍摊销。

  • 您希望有效地拆分和追加列表。
  • 你绝对确定你真的,真的,想要一个双重链接列表。

    在以下情况下使用HashMap:

  • 您希望将任意键与任意值相关联。

  • 您需要缓存。
  • 您需要一个没有额外功能的地图。

    在以下情况下使用 BTreeMap:

  • 您希望地图按其键排序。

  • 您希望能够按需获取一系列条目。
  • 您对最小或最大的键值对感兴趣。
  • 您希望查找小于或大于某些内容的最大或最小密钥。

    Map中任何一个的Set变体:

  • 您只想记住您见过哪些键。

  • 没有有意义的值可以与密钥关联。
  • 你只需要一套。

    在以下情况下使用二进制Heap:

  • 你想存储一堆元素,但只想在任何给定时间处理“最大”或“最重要”的元素。

  • 您需要一个优先级队列。

    vec

    https://doc.rust-lang.org/std/vec/index.html
    一种连续的可增长数组类型,其内容为 堆分配的内容,编写为 。Vec

    新建 vector

    1. let v: Vec<i32> = Vec::new();
    1. let v = vec![1, 2, 3];

    增加元素

    1. fn main() {
    2. let mut v = Vec::new();
    3. v.push(5);
    4. v.push(6);
    5. v.push(7);
    6. v.push(8);
    7. }

    弹出元素

    1. let mut v = vec![1, 2];
    2. let two = v.pop();

    get读取 vector

    1. pub fn getvector_demo1() {
    2. println!();
    3. let v = vec![1, 2, 3, 4, 5];
    4. //使用 & 和 [] 返回一个引用
    5. let third: &i32 = &v[2];
    6. println!("The third element is {}", third);
    7. //使用 get 方法以索引作为参数来返回一个 Option<&T>
    8. match v.get(2) {
    9. Some(third) => println!("The third element is {}", third),
    10. None => println!("There is no third element."),
    11. }
    12. }

    我们使用索引值 2 来获取第三个元素,索引是从 0 开始的。

    遍历 vector

    1. fn for_vector_demo1() {
    2. let v = vec![100, 32, 57];
    3. for i in &v {
    4. println!("for_vector_demo1 i is {}", i);
    5. }
    6. }
    1. pub fn for_mutvector_demo() {
    2. let mut v = vec![100, 32, 57];
    3. for i in &mut v {
    4. //原来数组对应的项的值都加上50
    5. *i += 50;
    6. //println!("for_mutvector_demo i is {}", *i);
    7. }
    8. for i in &v {
    9. //原来的值都加上50
    10. println!("for_mutvector_demo i is {}", i);
    11. }
    12. }

    储存多种类型

    1. fn vector_enum_demo() {
    2. enum SpreadsheetCell {
    3. Int(i32),
    4. Float(f64),
    5. Text(String),
    6. }
    7. let row = vec![
    8. SpreadsheetCell::Int(3),
    9. SpreadsheetCell::Text(String::from("blue")),
    10. SpreadsheetCell::Float(10.12),
    11. ];
    12. }