如何不使用循环与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
相关产品推荐
相关产品推荐

