我想从Vec
中删除一些元素,但vec.iter().filter().collect()
会使用借来的项目创建一个新的向量。
我想在没有额外内存分配的情况下改变原始Vec
(并将已删除元素的内存保留为向量的额外容量)。
答案 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]);
}
它还允许您获取已删除的元素,因为整个方法的返回值是迭代器!