所以如果我有一个 mut v: Vec<Foo>
我只想维护活着的
我愿意
v = v.into_iter().filter(|&foo| non_trivial_function_returning_a_result(foo).is_ok()).collect()
是否会分配一个新的向量,然后销毁原来的向量? 执行此操作的更好方法是什么?
最佳答案
将使用您提供的代码分配一个新的 Vec
。有几种可能的方法可以在不分配的情况下执行此操作,具体取决于您的约束(时间方面和稳定性)
Vec.retain
几乎最简单的方法是使用 Vec.retain
.
Retains only the elements specified by the predicate.
你可以这样使用它:
let mut vec = vec![1, 2, 3, 4];
vec.retain(|&x| non_trivial_function_returning_a_result(x).is_ok());
assert_eq!(vec, [2, 4]);
Vec.drain_filter
如果你想对需要所有权的删除元素做一些事情,你可以使用 Vec.drain_filter
方法。在撰写本文时,此方法仅适用于 nightly rust。
你可以这样使用它:
#![feature(drain_filter)]
let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
for x in numbers.drain_filter(|x| non_trivial_function_returning_a_result(x).is_ok()) {
// Do something with x
}
如果您需要所有权,但不想使用 nightly rust,您可以手动完成。
let mut i = 0;
while i != vec.len() {
if non_trivial_function_returning_a_result(&vec[i]).is_ok() {
let val = vec.remove(i);
// do something with val
} else {
i += 1;
}
}
关于rust - vector.into_iter().filter(some_non_trivial_function).collect() 是否可接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57704830/