Rust求众数代码报错E0515: cannot return value referencing temporary value
Rust E0515报错(返回临时值引用)解决方案
错误根因
- 遍历哈希表时使用了
occurrences.clone().iter(),此处clone()生成的哈希表是临时变量,当前for循环语句执行结束就会被销毁。你把这个临时哈希表内的元素引用存入mode向量返回,相当于返回了指向已销毁内存的悬垂引用,触发了Rust的借用规则检查,这是报错的直接原因。 - 返回值类型
Vec<&&i32>设计不合理,i32是实现了Copy trait的基础类型,直接返回持有值的向量即可,不需要传递多重引用,徒增生命周期管理成本。 - 额外隐患:你用来存储最高出现次数的
n向量初始为空,第一次执行occ > n[0]时会直接触发索引越界panic。
修改方案
- 把返回值类型改为
Vec<i32>,直接返回众数的数值,避免引用生命周期问题 - 去掉多余的
clone()调用,直接遍历原哈希表的迭代器 - 用单个
i32变量存储最高出现次数,替换原来的向量,避免空索引问题
修改后的完整代码:
use std::collections::HashMap; fn mode(vector: &Vec<i32>) -> Vec<i32> { let mut occurrences = HashMap::new(); let mut max_count = 0; let mut mode = Vec::new(); for i in vector { let j = occurrences.entry(i).or_insert(0); *j += 1; } for (num, occ) in occurrences.iter() { if occ > &max_count { max_count = *occ; mode.clear(); mode.push(**num); } else if occ == &max_count { mode.push(**num); } } mode } fn main() { let mut numbers: Vec<i32> = vec![1,5,2,2,5,3]; numbers.sort(); println!("the mode is {:?}:", mode(&numbers)); }
执行后输出the mode is [2, 5]:,符合预期。
内容的提问来源于stack exchange,提问作者xx_VxR_xx
相关产品推荐
相关产品推荐

