Rust HashMap是否允许存储重复键?代码运行结果存疑
Rust HashMap 键唯一性与你的代码疑问解答
Rust的HashMap绝对不允许重复键,每个键在HashMap里只会存在一次,这点完全不用怀疑。
你看到字符'l'对应的Vec里有2和3两个索引,根本原因不是HashMap存了重复的'l'键,而是你的代码逻辑是往同一个键对应的Value容器里追加元素,而非覆盖键或者插入新键。
举个例子,你说的测验代码大概是这样的:
use std::collections::HashMap; fn main() { let s = "hello!"; let mut map = HashMap::new(); for (idx, c) in s.chars().enumerate() { // 核心逻辑:如果键c不存在,就插入空Vec;如果存在,直接拿到这个Vec的可变引用 map.entry(c).or_insert_with(Vec::new).push(idx); } println!("{:?}", map); }
当遍历到第一个'l'(索引2)时,HashMap里还没有'l'这个键,所以会插入一个空Vec,然后把2推进去;遍历到第二个'l'(索引3)时,键'l'已经存在了,代码直接拿到之前那个Vec的可变引用,再把3推进去——整个过程中,HashMap里的'l'键始终只有一个,对应的Value是一个装了两个索引的Vec而已。
简单说:HashMap的键唯一是指键本身不会重复出现,但键对应的Value可以是能存多个值的类型(比如Vec),你代码里的操作是在给同一个键的Value添东西,不是加新键,自然不会被覆盖。
内容的提问来源于stack exchange,提问作者Soham
相关产品推荐
相关产品推荐

