由于对Rust还不太熟悉,我想知道如何创建一个带有默认值的HashMap键?例如,在HashMap中插入的任何键都有一个默认值0.

在Rust中,我知道这会创建一个空哈希映射:

let mut mymap: HashMap<char, usize> = HashMap::new();

我希望为一组 keys 维护一个计数器,其中一种方法似乎是:

for ch in "AABCCDDD".chars() {
    mymap.insert(ch, 0)
}

有没有一种方法可以更好地解决Rust 问题,或许可以与Ruby提供的功能相媲美:

mymap = Hash.new(0)
mymap["b"] = 1
mymap["a"] # 0

推荐答案

回答problem you have...

我想为一套 keys 维护一个柜台.

然后你想看看How to lookup from and insert into a HashMap efficiently?.提示:*map.entry(key).or_insert(0) += 1


回答question you asked...

如何使用Rust中的默认值创建HashMap?

不,HashMap没有存储默认值的位置.这样做会导致该数据 struct 的every个用户分配存储空间,这将是一种浪费.您还必须处理没有适当默认值的情况,或者无法轻松创建默认值的情况.

相反,您可以使用HashMap::get查找值,如果缺少,则使用Option::unwrap_or提供默认值:

use std::collections::HashMap;

fn main() {
    let mut map: HashMap<char, usize> = HashMap::new();
    map.insert('a', 42);

    let a = map.get(&'a').cloned().unwrap_or(0);
    let b = map.get(&'b').cloned().unwrap_or(0);

    println!("{}, {}", a, b); // 42, 0
}

如果unwrap_or不适用于您的 case ,则有几个类似的功能可能:

当然,欢迎你参加wrap this in a function or a data structure to provide a nicer API.


ArtemGr brings up an interesting point:

在C++中有一个映射inserting a default value when a key is accessed的概念.但这似乎总是有点漏洞百出:如果类型没有默认值呢?Rust对映射类型的要求较低,对键的存在(或不存在)要求更明确.

Rust 会增加皱纹.实际上inserting一个值需要简单地获得一个值也可以是change the 100.这将使对HashMap中的值的任何现有引用无效,因为可能需要重新分配.因此,您将无法同时获得对两个值的引用!这将是非常严格的.

Rust相关问答推荐

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

通过解引用将值移出Box(以及它被脱糖到什么地方)?

在Rust中是否可以使用Rc自动化约束传播

Tokio_Postgres行上未显示退回特性的生存期,且生命周期 不够长

对于已经被认为是未定义行为的相同数据,纯粹存在`&;[u32]`和`&;mut[u32]`吗?

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

我无法理解Rust范围的定义(Rust Programming Language,第二版克拉布尼克和尼科尔斯)

获取与父字符串相关的&;str的原始片段

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

我应该如何表达具有生命周期参数的类型的总排序,同时允许与不同生命周期进行比较?

Cargo.toml:如何有条件地启用依赖项功能?

实现 Deref 的 struct 可以返回对外部数据的引用吗?

.在 Rust 模块标识符中

Rust ECDH 不会产生与 NodeJS/Javascript 和 C 实现相同的共享密钥

Rust中如何实现一个与Sized相反的负特性(Unsized)

在 Rust 中使用 `SecTrustSettingsSetTrustSettings` 绑定导致 `errSecInternalComponent`

为什么允许重新分配 String 而不是 *&String

改变不实现克隆的 dioxus UseState struct

在 Rust 中为泛型 struct 编写一次特征绑定

BigUint 二进制补码