fadedbee Asked: 2025-01-17 23:27:44 +0800 CST2025-01-17 23:27:44 +0800 CST 2025-01-17 23:27:44 +0800 CST 如何增加地图中的计数器并获取当前计数 772 我可以用一个表达式来完成这个吗? *map.entry(key).or_default() += 1; let count = *map.get(&key).unwrap(); 理想情况下,我希望这是一个原子操作,但如果需要,我可以锁定。 https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=df6778cd1312c31eb230a545c6c2b6ce dictionary 2 个回答 Voted Best Answer groksrc 2025-01-17T23:46:25+08:002025-01-17T23:46:25+08:00 你可以: let count = *map.entry(key).and_modify(|v| *v += 1).or_insert(1); 这将: 获取或创建条目 如果存在,则增加它 如果不存在,则插入 1 返回对值的引用,然后我们取消引用 prog-fh 2025-01-17T23:51:53+08:002025-01-17T23:51:53+08:00 我不知道您是否认为以下初始化count只是一个表达式,但至少它避免了第二次查找.get()。 我猜原子操作是在整数上,而不是整个映射上(也许我错了)。 fn main() { let mut map = std::collections::HashMap::new(); map.insert(String::from("a"), std::sync::atomic::AtomicUsize::new(100)); // for k in ["a", "b"] { let key = String::from(k); let count = map .entry(key) .or_default() .fetch_add(1, std::sync::atomic::Ordering::Relaxed) + 1; println!("{} ~~> {}", k, count) } // println!("{:?}", map); } /* a ~~> 101 b ~~> 1 {"a": 101, "b": 1} */
你可以:
这将:
我不知道您是否认为以下初始化
count
只是一个表达式,但至少它避免了第二次查找.get()
。我猜原子操作是在整数上,而不是整个映射上(也许我错了)。