You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中HashMap的键必须为指针吗?TwoSum代码报错解析

Rust实现TwoSum时的HashMap键类型问题解析

问题原因分析

你遇到的expected &i32, found i32报错,并不是因为HashMap的键必须是指针,而是HashMap::contains_key方法的设计逻辑:

  • 该方法要求传入键类型的引用而非键本身,这么设计是为了避免不必要的内存拷贝——如果键是大类型(比如字符串),传值会产生额外开销,传引用更高效。
  • 你的HashMap键类型是i32,所以contains_key需要接收&i32类型的参数,直接传i32类型的complement自然会触发报错。

代码里的其他问题

除了参数类型错误,你的代码还有两处逻辑/语法问题:

  1. 存储逻辑错误:TwoSum的正确逻辑是存储当前遍历到的数值和索引,而非complement。你现在存的是complement,会导致后续无法正确匹配到之前的数值。
  2. get方法返回值处理错误:numToI.get(complement)返回的是Option<&usize>,不能直接强制转换为i32,需要先取出内部的usize值再转换。

修正后的代码

use std::collections::HashMap;
impl Solution {
    pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
        let mut num_to_idx: HashMap<i32, usize> = HashMap::new();
        // 直接通过&v解引用,省去手动赋值num的步骤
        for (i, &v) in nums.iter().enumerate() {
            let complement = target - v;
            // 使用if let语法更简洁地处理Option
            if let Some(&prev_idx) = num_to_idx.get(&complement) {
                return vec![prev_idx as i32, i as i32];
            }
            // 存储当前数值和索引
            num_to_idx.insert(v, i);
        }
        vec![-1, -1]
    }
}

Rust与C的差异学习建议

Rust和C最大的差异在于所有权、借用、生命周期这三个核心内存安全机制,你需要重点吃透这些内容:

  • 从官方《Rust程序设计语言》的对应章节入手,先理解所有权的基本规则(比如一个值同一时间只能有一个所有者),再深入学习可变/不可变借用的规则。
  • 多关注标准库方法的设计逻辑,比如HashMap的方法几乎都接收引用,这是Rust避免拷贝、保证内存安全的典型体现。
  • 重视编译器的报错信息,Rust的错误提示非常详细,跟着提示修改代码的过程,就是理解这些规则的最好方式。

内容的提问来源于stack exchange,提问作者TheDarkHoarse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:51:20