首页 > 解决方案 > 我可以用迭代器做到这一点吗?

问题描述

嗨,我写了一个将向量映射到区间 [0,1] 的函数:

fn vec2interval(v: &Vec<f32>) -> Vec<f32> {
    let total: f32 = v.iter().sum();
    let mut interval: Vec<f32> = vec![0f32; v.len()];
    interval[0] = v[0] / total;
    for i in 1..v.len() {
        interval[i] = interval[i-1] + v[i] / total;
    }
    return interval;
}

有没有办法对迭代器做同样的事情?我写了以下内容,但速度较慢,需要一个 for 循环:

fn vec2interval(v: &Vec<f32>) -> Vec<f32> {
    let total: f32 = v.iter().sum();
    let mut interval: Vec<f32> = v
        .iter()
        .map(|x| x / total)
        .collect::<Vec<f32>>();
    for i in 1..v.len() {
        interval[i] = interval[i-1] + interval[i];
    }
    return interval;
}

标签: rust

解决方案


scan可以完成所有工作:

fn vec2interval(v: &Vec<f32>) -> Vec<f32> {
    let total: f32 = v.iter().sum();

    v.iter()
        .scan(0.0, |acc, x| {
            *acc += x / total;
            Some(*acc)
        })
        .collect()
}

&[u8]此外,最好使用slice ( ) 而不是Vec<_>作为参数。


推荐阅读