rust - 检索scan()迭代器中的状态?

标签 rust iterator

为了获得整数序列的部分和,我可以在迭代器上使用scan(),如下所示:

let partial: Box<[u32]> =
    list
    .iter()
    .scan(0, |st, elem| {
        let ret = *st;
        *st += elem;
        Some(ret)
    })
    .collect();

上面的代码效果很好,但是我正在尝试对其进行修改,以使我也能得到总和。

就像是:
let (partial, total): (Box<[u32]>, u32) =
    list
    .iter()
    .scan(0, |st, elem| {
        // TODO
    })
    .collect();

看来我只需要获取st的最终值,并且迭代器应该已经知道它的值。但是,我似乎找不到找到该值的方法,除非在整个序列上进行第二次迭代(例如使用fold())。

有没有一种方法可以在一次遍历中找到部分和与总和?

最佳答案

将总和包括在scan中,然后将最后一个值除掉。

use std::iter;

fn main() {
    let list = vec![1, 2, 3, 4];

    // Add zero at the start to emulate what you had before
    let partial: Box<[u32]> = iter::once(0)
        .chain(list.iter().scan(0, |st, elem| {
            *st += elem;
            Some(*st)
        }))
        .collect();
    // unwrap since with the added zero, the slice will always be non-empty
    let (total, partial) = partial.split_last().unwrap();

    println!("partial sums: {:?}", partial);
    println!("total sum: {}", total);
}

(playground)

或使用 successors() :

fn main() {
    use std::iter::successors;

    let list = vec![1, 2, 3, 4];

    let mut iter = list.iter();
    let partial: Vec<_> = successors(Some(0), |n| iter.next().map(|i| n + i)).collect();
    // unwrap since with the added zero, the slice will always be non-empty
    let (total, partial) = partial.split_last().unwrap();

    assert_eq!(partial, &[0, 1, 3, 6]);
    assert_eq!(total, &10);
}

(playground)

关于rust - 检索scan()迭代器中的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60541787/

相关文章:

rust - 在枚举中需要元组变体的独特/特殊情况是什么?

Java:Cast on Iterator忽略除String类型以外的整数

java - Struts 2迭代器标签在jsp中不起作用?

c++ - 如何以线程安全的方式遍历容器?

rust - 通过 FFI 从 const 数组获取 `*const c_char` 的最佳方法是什么?

c - 调用编译为 dylib 的 Rust 库的 Swift 程序的性能影响?

java - 可迭代的自定义链表

c++ - STL 迭代器继承 : 'value_type' does not name a type

reference - 如何将引用元组转换为元组的引用?

string - 如何 append 到 Rust 哈希表中的字符串值?