rust - 我可以用迭代器做到这一点吗?

标签 rust

您好,我写了一个将向量映射到区间 [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;
}

最佳答案

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()
}

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

关于rust - 我可以用迭代器做到这一点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62807530/

相关文章:

rust - 可变 Vector 中引用的生命周期

rust - 如何做等于嵌套 `impl Trait` 的事情?

rust - 如何匹配 Rust 中的数据类型?

rust - 强制使用构造函数

rust - 如何将&str列表转换为静态&str列表?

rust - 在Rust中使用相同功能对 HashMap 进行就地修改,插入或删除

rust - 如何使简单的 futures::sync::mpsc::channel 示例工作?

rust - 如何结合 `Ord::cmp()`中的两个cmp条件

function - Rust 仅在拆分为多个语句时才编译方法链

rust - error[E0554] : #! [feature] 可能无法在稳定发布 channel 上使用无法使用 cargo 安装赛车