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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:06:04