在不创建临时向量的情况下迭代成对的块

Kor*_*nel 4 iterator rust

我试图将一个向量迭代为一对块(在我的例子中,它是一个表示为连续位图的图像,我希望能够同时访问两行中的像素).

问题是我做不到.chunks(w).chunks(2),但必须在两者之间创建一个临时向量.

有没有办法纯粹使用迭代器?(如果结果是迭代器本身,我很好)

操场

let input: Vec<_> = (0..12).collect();

let tmp: Vec<_> = input.chunks(3).collect();
let result: Vec<_> = tmp.chunks(2).collect();

println!("{:?}", result);
Run Code Online (Sandbox Code Playgroud)

[[[0,1,2],[3,4,5]],[[6,7,8],[9,10,11]]]

eul*_*isk 5

这是一种创建两个迭代器的解决方案,一个用于奇数行,一个用于偶数行。然后使用 将两者结合起来.zip(),这给出了一个充满对的迭代器:

fn main() {
    let input: Vec<_> = (0..12).collect();

    let it1 = input
        .chunks(3)
        .enumerate()
        .filter_map(|x| if x.0 % 2 == 0 { Some(x.1) } else { None });
    let it2 = input
        .chunks(3)
        .enumerate()
        .filter_map(|x| if x.0 % 2 != 0 { Some(x.1) } else { None });

    let r: Vec<_> = it1.zip(it2).collect();

    println!("{:?}", r);
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*vid 5

哦,我知道了!我可以分割更大的块:

input.chunks(2*3).map(|dbl| dbl.split_at(3)).collect();

是的,或者你可以这样做:

let tmp: Vec<_> = input
    .chunks(2 * 3)
    .map(|x| x.chunks(3).collect::<Vec<_>>())
    .collect();
Run Code Online (Sandbox Code Playgroud)

这输出与您的示例完全相同,没有您的解决方案中的元组和数组的混合:

[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
Run Code Online (Sandbox Code Playgroud)


Kor*_*nel 4

哦,我明白了!我可以分割更大的块:

input
   .chunks(2 * 100)
   .map(|pair| pair.split_at(100))
Run Code Online (Sandbox Code Playgroud)