首页 技术杂谈 正文
  • 本文约1569字,阅读需8分钟
  • 345
  • 0

Rust - HashMap

摘要

Rust的HashMap,键值对集合的高效存储。它基于哈希表实现,提供快速的数据插入和检索能力,是处理大量数据和复杂映射关系时的首选数据结构。

HashMap

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

2、通过Hash函数:决定如何在内存中存放K和V

  • 适用场景:通过K(任何类型)来寻找数据,而不是索引

1、创建HashMap

1、创建空HashMap:new() 函数

2、添加数据:insert() 方法


use std::collections::HashMap;

fn main() {
    // 创建hashmap
    // 如果只创建,不插入数据的话,会报错,要指定数据类型才不会报错
    //let mut scores:HashMap<String, i32> = HashMap::new();
    let mut scores = HashMap::new();
    // 插入数据
    scores.insert(String::from("年龄"), 10);
}

2、HashMap注意事项

1、HashMap用的比较少,不在Prelude中

2、标准库对其支持比较少,没有内置的宏来创建HashMap

3、其数据是存放在heap上

4、是同构的,一个HashMap中

  • 所有的k的类型必须一致
  • 所有的v的类型必须一致

3、另一种创建HashMap的方式:collect方法

1、在元素类型为Tuple(元组)的Vector上使用collect方法,可以组建一个HashMaps

  • 要求元组有两个值:一个作为K,一个作为V
  • collect方法可以把数据整合成多种集合类型,包括HashMap
  • 返回值需要显式的指明类型

4、HashMap的所有权

1、对于实现了Copy trait的类型(如i32),值都会被复制到HashMap中

2、对于拥有所有权的值(如string),值会被移动,所有权会被转移到HashMap中

    let hello_hash = String::from("hello");
        let world_hash = String::from("world");
        let mut all_hash = HashMap::new();
        all_hash.insert(hello_hash, world_hash);
        // println!("{},{}",hello_hash,world_hash); 报错

5、访问HashMap的值

1、通过get()方法

// 访问HashMap的值
    let get_hello = String::from("hello");
    let jg = all_hash.get(&get_hello);
    match jg {
        Some(jg) => println!("{}",jg),
        None => println!("空")
    }

6、遍历HashMap

1、通过for循环

// 遍历HashMap
    for (k,v) in &all_hash{
        println!("{}:{}",k,v);
    }

7、更新HashMap

1、HashMap的大小可变

2、每个K同时只能对应一个V

3、更新HashMap中的数据

  • K 存在,需要对V进行修改
    • 替换现有的V
    • 保留现有的v,忽略新的v
    • 合并现有的v和新的v
  • K不存在
    • 添加新的k,v

情况一、替换现有的v

  • 如果插入的k相同,v不同,那么后面的v的值会覆盖前面的值

情况二、只有K不对应任何值的情况下,才插入v

  • 使用entry方法,判断k中是否有值,没有就使用or_insert方法插入
  • 两个方法返回的都是引用
  // 更新hashmap
    // 情况一
    all_hash.insert(String::from("name"),String::from("小明"));
    all_hash.insert(String::from("name"),String::from("小宏"));
    println!("{:?}",all_hash);

    // 情况二
    // 插入一个新k,如果k中没有值,就添加一个值
    all_hash.entry(String::from("old")).or_insert(String::from("30"));
评论