首页 > 解决方案 > 如何在同一个向量上循环两次?

问题描述

我正在尝试更新向量的元素,知道彼此在哪里,测试所有元素对(无序),同时更改它们。所以我开始天真地写这个:

for x in &mut v {
    for y in &mut v {
        // ...
    }
}

但是我不能可变地借用向量两次,另外,我可以简单地避免大量迭代,写下:

for x in 0..v.len() - 1 {
    for y in x..v.len() - 1 {
        let mut xc = &mut v[x];
        let yc = &v[y];
        // ...
    }
}

这不起作用,因为我借用了不可变和可变引用!我该如何编写这种基本的循环?(我确实需要至少一个元素的可变性。)

标签: loopsvectorforeachrust

解决方案


所有权的概念不会让你以可变和不可变的方式借用相同的数据,因此在安全的 Rust 中,没有可能的解决方案来获取某个索引处的数据作为可变和不可变的引用。

无论如何,这可能不是您所需要的。Rust 包含一个允许您访问切片中的多个索引的功能:

fn main() {
    let mut v = vec![1, 2, 3];
    let len = v.len();
    for x in 0..len - 1 {
        let (first, second) = v.split_at_mut(x + 1);
        let xc = &mut first[x];
        *xc = *xc + 1; //some code that uses xc and yc if y == x
        for yc in second {
            *xc = *yc + 1; //some code that uses xc and yc if y > x
        }
    }
}

*xc = *yc + 1是一些使用引用的示例代码xcyc. 注意x == y必须分开处理的情况。


推荐阅读