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特征上没有这样的辅助方法.但是,有两种主要方法:
使用该[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)使用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().我在上面的例子中解决了这个问题.Vec<T>名称.您可以仅使用标准库实现与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.
也可以看看:
| 归档时间: |
|
| 查看次数: |
2950 次 |
| 最近记录: |