如何在迭代中迭代?

巴尔坎德

所以基本上,我想这样做

for i=0;i<x.len()-1
    for j=i;j<x.len
       //do stuff with x[j] and x[i] at the same time

例如,我想使用与使用 2 个for循环进行排序相同的技术,将元素与元素进行比较并交换它们。然而,我不想排序,只是给出了这个例子以便更好地理解。

我可以以某种方式这样做:

for x in vec.iter()
  for y in x.next()

或类似的东西?

另外,我可以在迭代时以某种方式记住某个元素的位置吗?

谢谢!

用户4815162342

您建议的代码:

for x in vec.iter()
    for y in x.next()

即使它在语法上有效x也不起作用,因为它不是迭代器,而是vec. 要获得迭代器,您需要将其存储在一个变量中并将for循环脱糖while let

let mut iter = v.iter();
while let Some(x) = iter {
    // ...
}

现在我们有了一个明确的iter,我们可以让内部循环迭代剩余的项目。我们不能只是迭代,iter因为这会耗尽它的外循环,但我们可以克隆它以获取当前位置的外迭代器的副本:

let mut iter = v.iter();
while let Some(x) = iter {
    for y in iter.clone() {
        // ...
    }
}

请注意,我们不需要iter.next()在内循环之前显式调用,因为第一项已经被外循环花费了,内循环自然只会观察每次迭代的剩余项。

完整的代码如下所示:

let v = vec![1, 2, 3];
let mut iter = v.iter();
while let Some(x) = iter.next() {
    println!("x = {}", x);
    for y in iter.clone() {
        println!("    y = {}", y);
    }
}

输出:

x = 1
    y = 2
    y = 3
x = 2
    y = 3
x = 3

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章