是否可以使用迭代器将矢量拆分为10个组?

Teo*_*Teo 11 iterator vector rust

我有let my_vec = (0..25).collect::<Vec<_>>(),我想分成my_vec10组的迭代器:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19];
[20, 21, 22, 23, 24, None, None, None, None, None];
Run Code Online (Sandbox Code Playgroud)

在Rust中使用迭代器可以做到这一点吗?

Luk*_*odt 15

Iterator特征上没有这样的辅助方法.但是,有两种主要方法:

  1. 使用该[T]::chunks()方法(可以直接调用Vec<T>).但是,它有一个小的区别:它不会产生None,但最后一次迭代会产生一个较小的切片.

    示例:

    let my_vec = (0..25).collect::<Vec<_>>();
    
    for chunk in my_vec.chunks(10) {
        println!("{:02?}", chunk);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    [00, 01, 02, 03, 04, 05, 06, 07, 08, 09]
    [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    [20, 21, 22, 23, 24]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用Itertools::chunks()方法箱子itertools.这个箱子扩展Iterator了标准库的特性.所以这个chunks()方法适用于所有迭代器!请注意,使用稍微复杂一些.这与上述方法具有相同的行为:在最后一次迭代中,块将更小而不是包含Nones.

    示例:

    extern crate itertools;
    use itertools::Itertools;
    
    for chunk in &(0..25).chunks(10) {
        println!("{:02?}", chunk.collect::<Vec<_>>());
    }
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    [00, 01, 02, 03, 04, 05, 06, 07, 08, 09]
    [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    [20, 21, 22, 23, 24]
    
    Run Code Online (Sandbox Code Playgroud)

还请注意:

  • 在你的代码中,Iterator没有做你期望它做的事情!它将创建一个带有一个元素的向量.那个元素是一个[T]::chunks().我在上面的例子中解决了这个问题.
  • 在Rust中,变量具有Vec<T>名称.


She*_*ter 7

您可以仅使用标准库实现与Lukas Kalbertodt 的 itertools 示例类似的解决方案:

let my_vec = (0..25).collect::<Vec<_>>();

let mut my_values = my_vec.into_iter().peekable();

while my_values.peek().is_some() {
    let chunk: Vec<_> = my_values.by_ref().take(10).collect();
    println!("{:?}", chunk);
}
Run Code Online (Sandbox Code Playgroud)

结果:

let my_vec = (0..25).collect::<Vec<_>>();

let mut my_values = my_vec.into_iter().peekable();

while my_values.peek().is_some() {
    let chunk: Vec<_> = my_values.by_ref().take(10).collect();
    println!("{:?}", chunk);
}
Run Code Online (Sandbox Code Playgroud)

如果您实际上不需要Vec每个块的 ,则可以省略collect调用并直​​接对由by_ref.

也可以看看: