迭代它时删除一个元素

rap*_*2-h 3 rust

有没有办法在迭代时删除元素?这是一个代码示例:

for particle in &mut particles {

    let mut delete = false;
    // Do stuff...

    if delete {
        // Remove element from particles vector <-- THIS
    }

}
Run Code Online (Sandbox Code Playgroud)

我认为这种(脏)设计是不可能的.为了知道我需要删除哪个元素,假设我需要迭代以便删除向量中的某些元素,这是什么常见(优雅?)模式?如果重复,请随意关闭.

Luk*_*odt 7

你可能想用Vec::retain().它允许您决定是否保留每个元素.所以在你的情况下,这将是这样的:

particles.retain(|particle| {
    let delete = {
        // Do stuff ...
    };
    !delete
})
Run Code Online (Sandbox Code Playgroud)

你必须bool从关闭中返回一个.如果您返回true,则不会删除该元素; 如果你返回false,它将被删除.

如果你需要以某种方式将一个元素与向量中的所有其他元素进行比较,那么retain()就不够了.对于这种情况,你可以在这里找到一个很棒的答案.

  • 如果向量中的项目不需要突变,则此olny 有效。如果需要变异,那么可以使用(目前不稳定的)Vec::drain_filter 方法。 (5认同)
  • 仅供参考,自 Rust 1.61 以来,有一个(稳定的)[Vec::retain_mut](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.retain_mut),它允许改变Vec,同时丢弃其中一些。 (2认同)