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

Iva*_*shi 2 idiomatic rust

什么是在矢量的前半部分迭代(读取)并根据第一个更改矢量的后半部分的结构的惯用方法?这是非常抽象的,但一些算法可以归结为这个问题.我想在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--;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

red*_*ime 6

对于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;
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接

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