当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust Vec.drain_filter用法及代码示例


本文简要介绍rust语言中 std::vec::Vec.drain_filter 的用法。

用法

pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<'_, T, F, A> where    F: FnMut(&mut T) -> bool,

创建一个迭代器,它使用闭包来确定是否应删除元素。

如果闭包返回 true,则元素被移除并生成。如果闭包返回 false,则元素将保留在向量中并且不会被迭代器产生。

使用该方法等价于以下代码:

let mut i = 0;
while i < vec.len() {
    if some_predicate(&mut vec[i]) {
        let val = vec.remove(i);
        // your code here
    } else {
        i += 1;
    }
}

但是drain_filter 更容易使用。 drain_filter 也更高效,因为它可以批量回移数组的元素。

请注意,drain_filter 还允许您改变过滤器闭包中的每个元素,无论您选择保留还是删除它。

例子

将数组拆分为偶数和奇数,重用原始分配:

#![feature(drain_filter)]
let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];

let evens = numbers.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
let odds = numbers;

assert_eq!(evens, vec![2, 4, 6, 8, 14]);
assert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 std::vec::Vec.drain_filter。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。