在Rust中查找HashMap <(String,usize),f64>中的键

6

我有一个 HashMap<(String, usize), f64>。 我还有一个 &str 和一个 usize,我想在这个 HashMap 中进行查找而不需要克隆。 有没有一种方法可以将 (&str, usize) 查找作为 (String, usize) 进行处理?


1
如果可能的话,您必须使用Cow,请参见https://dev59.com/11oV5IYBdhLWcg3wRs4w。 - tafia
你不想使用 HashMap<(&str, usize), f64> 有什么原因吗?也许是我对 Rust 的理解还不够,但这对我来说似乎是一个合理的解决方案。 - user25064
1
@user25064,有些东西需要持有String的分配,也许映射的键是最自然的选择。不过,根据使用情况,将它们拆分开来可能是一个潜在的解决方案。 - Shepmaster
2个回答

5
不行,查找 HashMap<K,V> 的选项有:
  • entry 方法,需要通过值传递 K,在您的情况下是一个 (String, usize) - 因此您需要构造一个 String
  • 各种 getcontains_key 等都采用 "借用" 形式的 K(文档中说 &Q,其中 K: Borrow<Q>;这意味着要么是 &(String, usize),要么是可以产生它的东西)。
从技术上讲,您可以遍历它并进行自己的比较,但这可能不是您想要的!

请注意,这已经不再是真实的情况了。从2018版开始,您可以使用&str查找字符串键。 - Kenji

4

然而,有一种不需要分配字符串的方法来做到这一点。但是你需要更改你的Hashmap,所以键是类型为(std::borrow::Cow<'a, str>, usize)(对于某些生命周期'a)。然后你可以使用map.get((Cow::Borrowed(my_str_slice), 0))来查找值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接