Rust for循环中如何追踪前一个索引 解决下标减一溢出报错
报错原因
你使用enumerate遍历向量时,第一个元素的索引是0,执行idx - 1会触发无符号整数下溢,直接导致程序panic。另外你当前的判断条件也写反了:你要统计比前一个数大的元素,应该判断当前元素 > 前一个元素,而不是反过来。
方案1:调整遍历起始索引
直接从索引1开始遍历,跳过没有前序元素的第一个元素即可规避下溢问题:
fn get_result(depths: &Vec<u32>) { let mut result: Vec<u32> = Vec::new(); // 从第2个元素(索引1)开始遍历 for idx in 1..depths.len() { if depths[idx] > depths[idx - 1] { result.push(depths[idx]); } } println!("符合条件的元素数量:{},元素列表:{:?}", result.len(), result); }
方案2(更推荐,Rust惯用写法):使用windows迭代器
切片的windows(2)方法会依次返回包含相邻两个元素的长度为2的切片,不需要手动处理索引,从根源避免越界、下溢等低级错误:
fn get_result(depths: &Vec<u32>) { let mut result: Vec<u32> = Vec::new(); // 每次取相邻两个元素 for window in depths.windows(2) { let prev = window[0]; let curr = window[1]; if curr > prev { result.push(curr); } } println!("符合条件的元素数量:{},元素列表:{:?}", result.len(), result); }
如果只需要统计数量不需要收集符合条件的元素,可以直接用迭代器链式调用简化代码:
fn get_count(depths: &Vec<u32>) -> usize { depths.windows(2).filter(|w| w[1] > w[0]).count() }
内容的提问来源于stack exchange,提问作者Caio Ishikawa
相关产品推荐
相关产品推荐

