Rust 迭代器类似于 chunks() 函数

6

这个迭代器

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循环来实现,但是迭代器能否做得更好?


2个回答

7

我猜你可以使用 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)

编辑: 正如@Masklinn在评论1和@SebastianRedl在评论2中所指出的,您还可以使用stdlib中的windows,避免在项目中包含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]

5
就此而言,stdlib 中有 windows 方法可以迭代切片并且可能已经足够使用了。 - Masklinn
@Masklinn 谢谢,我编辑了我的答案并包含了您的建议。 - mgc
2
@mgc 在你的回答中应该注意到,windows 仅适用于切片(或可以强制转换为它们的东西),而不是一般的迭代器。 - Sebastian Redl

6

或者,不需要额外的依赖项,您可以将相同的迭代器压缩,然后在第二个迭代器上跳过一个项目。

fn main() {
    let data = vec![0, 1, 2, 3, 4, 5];
    let i1 = data.iter();
    let i2 = data.iter();
    for (a, b) in i1.zip(i2.skip(1)) {
        println!("{} {}", a, b);
    }
}

游乐场


这要简单得多。 - Ricky Han

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接