如何惯用迭代数组的一半并修改另一半的结构?

时间:2017-06-29 17:57:33

标签: rust idiomatic

在向量的前半部分迭代(读取)并根据第一个更改向量的后半部分的结构是什么?这是非常抽象的,但一些算法可以归结为这个问题。我想在Rust中编写这个简化的C ++示例:

for (var i = 0; i < vec.length; i++) {
    for (var j = i + 1 ; j < vec.length; j++) {
        if (f(vec[i], vec[j])) {
            vec.splice(j, 1);
            j--;
        }
    }
}

1 个答案:

答案 0 :(得分:5)

对于Rust和C,这个通用问题的惯用解决方案是相同的,因为没有可以简化的约束。

我们需要使用索引,因为向量重新分配将使迭代器包含的引用无效。我们需要将索引与每个周期的向量当前长度进行比较,因为长度可以改变。因此,惯用解决方案将如下所示:

let mut i = 0;
while i < v.len() {
    let mut j = i + 1;
    while j < v.len() {
        if f(v[i], v[j]) {
            v.splice(j, 1);
        } else {
            j += 1;
        }
    }
    i += 1;
}

Playground link

虽然此代码涵盖了一般情况,但它很少有用。它没有捕获具体细节,这些细节通常是手头问题所固有的。反过来,编译器无法在编译时捕获任何错误。我不建议先写一些这样的东西而不考虑其他方法。