欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 【关于Rust HashMap使用的一点思考】

【关于Rust HashMap使用的一点思考】

2025/2/27 16:09:17 来源:https://blog.csdn.net/m0_37719524/article/details/144004497  浏览:    关键词:【关于Rust HashMap使用的一点思考】

Rust HashMap

  • HashMap


HashMap

在日常开发中,容器在各种语言中通常作为存储短时或从属某类的数据集合,而集合数据尤其是在一个事务周期内的值经常会发生改变,对于最常用的 vector 在rust中来说很简单使用Index获取value即可,因为他被实现了IndexMut,而Rust中带有Vec前缀的容器组都实现了IndexMut Trait,这也就说明,这些容器在日常使用时和C++,C#,等语言的使用方式基本雷同。HashMap却有所不同:
在这里插入图片描述
15年时HashMap便被移除了IndexMut,所以在日常使用时无法使用【map[xx] = xxx】这样的写法,图中文字也告诉我们出于设计的考虑不予支持。

所以在使用时,从其他语言转来的通常习惯了使用for循环迭代数据并改变,那么你可以这样做:

    for (_, val) in mymap.iter_mut() {*val *= 2;}
    for i in 0..n {if let Some(v) = hashmap.get_mut(&(nums[i] as i64)) {*v -= 1;}

通过将HashMap转换为迭代器,从而修改value值或直接遍历map然后通过可变引用改变map内部值,也可以通过Insert:

    let mut vector = vec![1, 2, 1, 3];let mut mymap: HashMap<i32, i32> = HashMap::new();for i in vector.iter() {mymap.insert(*i, 1);}

将新值直接插入map,当开发者做统计时,如统计一个数组不同元素出现的次数,这样写总归不如"map[k] = v;"来的方便。
还记得iterator文中提到的,容器之所以能够迭代是因为实现了迭代器特征,同样的,开发者在日常使用中,可将容器转为迭代器,并使用Rust 提供的一系列方法,十分方便的操作容器。

    let _ = &nums[0..k].iter().for_each(|x| {*hashmap.entry(*x as i64).or_default() += 1;sum += *x as i64;});
*hashmap.entry(*x as i64).or_default()
这样的方法对于开发者更加友好和可读,entry尝试通过key获取节点。
or_default 如果值不存在则插入此类型的默认值并将可变引用返回。这样在实现一些算法时尤其好用,开发者可在迭代时初始化值并改变值。

上述代码看起来就比较rusty


在使用Rust容器中有很多很方便得用法,多查阅手册会写出更美观可读的代码。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词