Rust 创建HashMap<;i32,i32>;锈迹斑斑

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

在尝试用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);
}
在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]
参数更为惯用(因为它允许可能参数的严格超集)。