当向量v可能为空时,如何正确遍历0..v.len()-1区间?
解决空向量时
0..v.len()-1的溢出问题(保持原逻辑不变) 原代码在向量为空时,v.len()-1会触发无符号整数(usize)的下溢panic,因为0usize - 1不符合无符号整数的取值范围。要在不改变原逻辑、不使用有符号整数、不单独判断空向量的前提下修复这个问题,可以利用Rust无符号整数的saturating_sub方法:
修改后的代码:
fn main() { let v: Vec<i32> = vec![]; // 可替换为vec![5, 6, 7]测试正常场景 for i in 0 .. v.len().saturating_sub(1) { for j in i + 1 .. v.len() { println!("{} {}", v[i], v[j]); } } }
方案说明:
- 正常场景(向量非空):
v.len().saturating_sub(1)等价于v.len() - 1,完全保留原循环的遍历范围和逻辑,输出结果与原代码一致; - 空向量场景:
0usize.saturating_sub(1)会返回0,此时循环范围变为0..0,外层循环直接跳过,不会执行任何迭代,自然避免了溢出panic,也符合空向量无两两组合的预期。
该方案完全满足要求:
- 未改变原程序的结构与逻辑;
- 全程使用无符号整数,无类型转换;
- 无需额外判断向量是否为空,仅通过原生方法简洁处理边界情况。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

