多层循环中的 rust 向量迭代器

jv4diomz  于 2023-01-30  发布在  其他
关注(0)|答案(2)|浏览(118)

我试着在向量切片上使用迭代器,但它就是不起作用。
我的代码如下

pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
        let mut res: Vec<Vec<i32>> = Vec::new();

        for (n1, &i1) in nums.iter().enumerate() {
            for (n2, &i2) in nums[(n1 + 1)..].iter().enumerate() {
                for (n3, &i3) in nums[(n2 + 1)..].iter().enumerate() {
                    if i1 + i2 + i3 == 0 {
                        res.push(Vec::from([i1, i2, i3]));
                    }
                }
            }
        }
        return res;
    }

我期望n2循环在n1到n1结束的nums中循环,但它只是从开始循环,而不管n1是什么。
n3上也发生了同样的情况。
我是否正确地使用了迭代器和切片?

pbpqsu0x

pbpqsu0x1#

正如你在文档中看到的,enumerate只计算迭代的次数,如果你想跳过迭代器的前n元素,你应该使用skip函数来代替,它也能更清楚地表达你的意图。

nums.iter().enumerate().skip(n)

但是,请注意enumerateskip的顺序:这样你就可以先构造一个枚举迭代器,然后跳过一些元素,这样你的索引也会“从”n开始。相反,你可以先跳过元素,然后从0开始计数。

1hdlvixo

1hdlvixo2#

enumerate无法知道您要从何处开始计数,因此它始终从0开始。如果您要从其他数字开始计数,可以使用带范围的zip

pub fn three_sum(nums: Vec<i32>) -> Vec<[i32;3]> {
    let mut res = Vec::new();

    for (n1, &i1) in nums.iter().enumerate() {
        for (n2, &i2) in (n1+1..).zip(nums[(n1 + 1)..].iter()) {
            for (n3, &i3) in (n2+1..).zip(nums[(n2 + 1)..].iter()) {
                if i1 + i2 + i3 == 0 {
                    res.push([i1, i2, i3]);
                }
            }
        }
    }
    res
}

相关问题