是否可以就地过滤矢量?

Kor*_*nel 14 iterator rust

我想从a中删除一些元素Vec,但是vec.iter().filter().collect()使用借来的项创建一个新的向量.

我想在Vec没有额外内存分配的情况下改变原始内容(并将已删除元素的内存保留为向量的额外容量).

eul*_*isk 20

如果要删除元素,可以使用retain(),如果闭包返回,则从向量中删除元素false:

let mut vec = vec![1, 2, 3, 4];
vec.retain(|&x| x % 2 == 0);
assert_eq!(vec, [2, 4]);
Run Code Online (Sandbox Code Playgroud)

如果要修改元素,则必须在a中执行此操作for x in vec.iter_mut().


She*_*ter 6

如果你真的想过滤时改变向量的元素,你可以使用 nightly-only 方法Vec::drain_filter,一个非常灵活的工具:

#![feature(drain_filter)]

fn main() {
    let mut vec = vec![1, 2, 3, 4];
    vec.drain_filter(|x| {
        if *x % 2 == 0 {
            true
        } else {
            *x += 100;
            false
        }
    });
    assert_eq!(vec, [101, 103]);
}
Run Code Online (Sandbox Code Playgroud)

它还允许您获取已删除的元素,因为整个方法的返回值是一个迭代器!