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

标签 rust

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

相关文章:

arrays - 数组向量的内存布局是什么?

rust - Rust 中的 move 语义

rust - 列出作用域中某个类型实现的所有特征

string - 切片字符串会复制底层数据吗?

c - 如何将C结构传递给Rust?

rust - 从 os::args 对字符串调用 from_str 时类型不匹配

rust - 是否可以临时拥有结构字段?

rust - 如何使用另一个切片作为分隔符来拆分切片?

reference - 有没有办法返回对函数中创建的变量的引用?

enums - Rust Enum的问题