gpt4 book ai didi

rust - vector.into_iter().filter(some_non_trivial_function).collect() 是否可接受

转载 作者:行者123 更新时间:2023-11-29 08:11:08 26 4
gpt4 key购买 nike

所以如果我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com