我想从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().
如果你真的想在过滤时改变向量的元素,你可以使用 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)
它还允许您获取已删除的元素,因为整个方法的返回值是一个迭代器!