Rust 迭代器类似于 chunks()

标签 rust iterator

这个迭代器

let data = vec![0, 1, 2, 3, 4, 5];

for x in data.chunks(2) {
    println!("{:?}", x);
}
会产生
[0, 1]
[2, 3]
[4, 5]
我可以使用迭代器来获得这样的东西吗?
[0, 1]
[1, 2]
[2, 3]
[3, 4]
[4, 5]
我知道如何使用 for 循环来做到这一点。但是迭代器可以做得更好吗?

最佳答案

我想你可以使用 Itertools.tuple_windows为了这。根据文档,它“在所有连续窗口上返回一个迭代器,生成特定大小的元组(最多 4 个)”:

use itertools::Itertools;
use itertools::TupleWindows;
use std::slice::Iter;

let data = vec![0, 1, 2, 3, 4, 5];

let it: TupleWindows<Iter<'_, i32>, (&i32, &i32)> = data.iter().tuple_windows();

for elem in it {
    println!("{:?}", elem);
}
输出:
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
编辑 :
comment1 中所述来自@Masklinn 和 comment2 @SebastianRedl,您也可以使用 windows 来自 stdlib 并避免包含 Itertools在你的项目中。但请注意,它仅适用于切片(或强制切片的事物),而不适用于通用迭代器(在您的情况下很好)。
let data = vec![0, 1, 2, 3, 4, 5];

let it = data.windows(2);

for elem in it {
    println!("{:?}", elem);
}
输出:
[0, 1]
[1, 2]
[2, 3]
[3, 4]
[4, 5]

关于Rust 迭代器类似于 chunks(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65822952/

相关文章:

plugins - 如何正确处理程序宏中的跨度?

rust - 如何将切片与字节字符串文字进行比较?

rust - 为 Iterator+Clone : conflicting implementations 实现特征

java - 如果调用了remove()但什么都不做,迭代器会被损坏吗?

c++ - 可以将原始指针传递给需要迭代器的模板函数吗?

rust - 如何在 Rust 中获取带有条件的可变切片

rust - Rust 是否有 -Ofast -march=native 的等价物?

c++ - 多重映射迭代器是否也需要排序函数的类型?

c++ - 为什么我不能使用列表迭代器逻辑比较运算符?

c++ - 对双倍递增的 OutputIterator 的取消引用赋值