是否可以就地过滤矢量?

时间:2015-06-18 10:54:21

标签: iterator rust

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

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

2 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:2)

如果你真的想在过滤过滤器时真的想要改变它,那么你可以使用仅限夜间的方法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]);
}

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