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

如何不使用循环与for_each,通过迭代器比较前后元素并处理vector?

用Rust迭代器实现移除小于前一个元素的项

要处理[1, 2, 4, 3]并移除小于前一个元素的3,可以用scan迭代器跟踪前一个元素的状态,结合迭代器链完成需求,全程不需要循环或for_each。具体实现如下:

fn main() {
    let vec = vec![1, 2, 4, 3];
    let filtered_vec: Vec<i32> = vec
        .into_iter()
        .scan(None, |prev_state, current| {
            match prev_state {
                // 处理第一个元素:直接保留,将其记录为前一个元素
                None => {
                    *prev_state = Some(current);
                    Some(current)
                }
                // 处理后续元素:对比当前元素与前一个,符合条件则保留并更新状态
                Some(prev) => {
                    if current >= *prev {
                        *prev_state = Some(current);
                        Some(current)
                    } else {
                        // 不符合条件,过滤该元素
                        None
                    }
                }
            }
        })
        .collect();
    
    println!("{:?}", filtered_vec); // 输出: [1, 2, 4]
}

关键步骤说明:

  • into_iter():把原vector转换为所有权迭代器,迭代器会获取元素所有权,后续生成新vector时无需额外复制操作。
  • scan(None, ...):scan是带状态的迭代器,允许我们在迭代过程中维护一个可变状态(这里用Option<i32>存储前一个元素)。闭包接收状态的可变引用和当前元素,返回Option<T>:返回Some(current)则保留该元素,返回None则过滤掉。
  • collect():将迭代器处理后的元素收集为新的Vec<i32>。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:01:19