【发布时间】:2017-01-02 22:51:08
【问题描述】:
在尝试使用 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() {
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);
}
编译器抱怨:
error[E0308]: mismatched types
--> two_sum.rs:6:23
|
6 | match map.get(target - x) {
| ^^^^^^^^^^ expected reference, found i32
|
= note: expected type `&_`
= note: found type `i32`
error[E0308]: mismatched types
--> two_sum.rs:7:32
|
7 | Some(k) => return (k, i),
| ^ expected usize, found reference
|
= note: expected type `usize`
= note: found type `&_`
在 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 与原始类型一起使用?
【问题讨论】:
-
std::collections::HashMap::get 的签名说是,使用参考。
-
注意:
two_sum采用&[i32]参数更为惯用(因为它允许可能参数的严格超集)。
标签: rust