Are there equivalents to slice::chunks/windows for iterators to loop over pairs, triplets etc?

后端 未结 2 1807
遇见更好的自我
遇见更好的自我 2020-11-29 09:51

It can be useful to iterate over multiple variables at once, overlapping (slice::windows), or not (slice::chunks).

This only works for slices; is it possible to do t

2条回答
  •  情书的邮戳
    2020-11-29 10:46

    It's possible to take chunks of an iterator using Itertools::tuples, up to a 4-tuple:

    use itertools::Itertools; // 0.9.0
    
    fn main() {
        let some_iter = vec![1, 2, 3, 4, 5, 6].into_iter();
    
        for (prev, next) in some_iter.tuples() {
            println!("{}--{}", prev, next);
        }
    }
    

    (playground)

    1--2
    3--4
    5--6
    

    If you don't know that your iterator exactly fits into the chunks, you can use Tuples::into_buffer to access any leftovers:

    use itertools::Itertools; // 0.9.0
    
    fn main() {
        let some_iter = vec![1, 2, 3, 4, 5].into_iter();
    
        let mut t = some_iter.tuples();
        for (prev, next) in t.by_ref() {
            println!("{}--{}", prev, next);
        }
        for leftover in t.into_buffer() {
            println!("{}", leftover);
        }
    }
    

    (playground)

    1--2
    3--4
    5
    

    It's also possible to take up to 4-tuple windows with Itertools::tuple_windows:

    use itertools::Itertools; // 0.9.0
    
    fn main() {
        let some_iter = vec![1, 2, 3, 4, 5, 6].into_iter();
    
        for (prev, next) in some_iter.tuple_windows() {
            println!("{}--{}", prev, next);
        }
    }
    

    (playground)

    1--2
    2--3
    3--4
    4--5
    5--6
    

    If you need to get partial chunks / windows, you can get

提交回复
热议问题