【问题标题】:Remove an element while iterationg over it [duplicate]迭代时删除元素[重复]
【发布时间】:2017-09-04 08:56:00
【问题描述】:

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

for particle in &mut particles {

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

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

}

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

【问题讨论】:

    标签: rust


    【解决方案1】:

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

    particles.retain(|particle| {
        let delete = {
            // Do stuff ...
        };
        !delete
    })
    

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

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

    【讨论】:

    • 如果不需要对向量中的项目进行变异,则此 olny 有效。如果需要突变,那么可以使用(当前不稳定的)Vec::drain_filter 方法。
    猜你喜欢
    • 2013-01-23
    • 2010-11-09
    • 2011-07-13
    • 1970-01-01
    • 2011-04-23
    • 2018-07-18
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多