iteratorrust

is it possible to filter on a vector in-place?


I'd like to remove some elements from a Vec, but vec.iter().filter().collect() creates a new vector with borrowed items.

I'd like to mutate the original Vec without extra memory allocation (and keep memory of removed elements as an extra capacity of the vector).


Solution

  • If you want to remove elements, you can use retain(), which removes elements from the vector if the closure returns false:

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

    If you want to modify the elements in place, you have to do that in a for x in vec.iter_mut().