Rust 创建HashMap<;i32,i32>;锈迹斑斑
在尝试用Rust解决LeetCode问题时,我遇到了一个奇怪的问题:看起来我无法用基元类型创建Rust 创建HashMap<;i32,i32>;锈迹斑斑,rust,Rust,在尝试用Rust解决LeetCode问题时,我遇到了一个奇怪的问题:看起来我无法用基元类型创建HashMap: use std::collections::HashMap; fn two_sum(nums: &Vec<i32>, target: i32) -> (usize, usize) { let mut map = HashMap::new(); for (i, x) in nums.iter().enumerate() { ma
HashMap
:
use std::collections::HashMap;
fn two_sum(nums: &Vec<i32>, target: i32) -> (usize, usize) {
let mut map = HashMap::new();
for (i, x) in nums.iter().enumerate() {
match map.get(target - x) {
Some(k) => return (k, i),
None => map.insert(x, i)
};
}
return (0, 0);
}
fn main() {
let ret = two_sum(&vec![1,2,3], 4);
println!("{}, {}", ret.0, ret.1);
}
在Rust中是否需要始终使用HashMap的引用
编辑:
看来有必要。。。这个解决方案看起来有点难看,但无论如何都有效
use std::collections::HashMap;
fn two_sum(nums: &[i32], target: i32) -> (usize, usize) {
let mut map = HashMap::new();
for (i, x) in nums.iter().enumerate() {
let df = target - x;
if map.contains_key(&df) {
return (*map.get(&df).unwrap(), i);
}
map.insert(x, i);
}
return (0, 0);
}
fn main() {
let ret = two_sum(&vec![1,2,3], 4);
println!("{}, {}", ret.0, ret.1);
}
我想知道是否有更好的解决方案或最佳实践可以将HashMaps与基元类型一起使用?如果您检查
get
方法的签名,您将意识到:
- 它接受一个参数
,该参数以&Q
K:Borrow,Q:Hash+Eq
- 它返回
选项
get
的接口需要引用并返回引用
这意味着:
fn two_sum(nums: &Vec<i32>, target: i32) -> (usize, usize) {
let mut map = HashMap::new();
for (i, x) in nums.iter().enumerate() {
match map.get(&(target - x)) {
// ^~~~~~~~~~~~~
Some(k) => return (*k as usize, i),
// ^~~~~~~~~~~
None => map.insert(x, i)
};
}
return (0, 0);
}
就这样<代码>哈希映射和基本类型
旁注:与其他一些语言不同,基元类型在Rust中几乎无法与其他类型区分。如果您检查
get
方法的签名,您将意识到:
- 它接受一个参数
,该参数以&Q
K:Borrow,Q:Hash+Eq
- 它返回
选项
get
的接口需要引用并返回引用
这意味着:
fn two_sum(nums: &Vec<i32>, target: i32) -> (usize, usize) {
let mut map = HashMap::new();
for (i, x) in nums.iter().enumerate() {
match map.get(&(target - x)) {
// ^~~~~~~~~~~~~
Some(k) => return (*k as usize, i),
// ^~~~~~~~~~~
None => map.insert(x, i)
};
}
return (0, 0);
}
就这样<代码>哈希映射和基本类型
旁注:与其他一些语言不同,基元类型在Rust中几乎无法与其他类型区分。的签名表示是,使用引用。注意:
two\u sum
采用&[i32]
参数(因为它允许严格的可能参数超集)。的签名表示是,使用引用。注意:two\u sum
采用&[i32]
参数更为惯用(因为它允许可能参数的严格超集)。